Grundlagen der Programmiersprache C

union { uint32_t w; uint8_t b[4]; } u;
u.w = 0x12345678;
printf("%02X %02X\n", u.b[0], u.b[1]);

uint32_t sei ein vorzeichenloser 32-Bit- und uint8_t ein vorzeichenloser 8-Bit-Ganzzahltyp, und die Umgebung sei Little-Endian. Welche Ausgabe erzeugt der obige Code bei der Ausführung?

  1. A12 34
  2. B78 56
  3. C87 65
Antwort und Erläuterung anzeigen

Antwort: B. 78 56

Die Member einer Union liegen überlappend ab derselben Adresse, daher stellen u.b[0] bis u.b[3] jeweils eines der 4 Byte von u.w dar. Bei Little-Endian liegt das niederwertigste Byte an der kleinsten Adresse, daher wird 0x12345678 ab der kleinsten Adresse in der Reihenfolge 78, 56, 34, 12 abgelegt. u.b[0] ist also 0x78 und u.b[1] 0x56. Das Lesen über einen anderen Member als den beschriebenen eignet sich so zum Untersuchen der Bytereihenfolge, das Ergebnis hängt aber von der Endianness ab.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. Welche Ausgabe erzeugt der obige Code, der 9 in ein 3-Bit-Bitfeld schreibt, bei der Ausführung?
  2. Welche Ausgabe erzeugt der obige Code, der das mit #define definierte Makro SQUARE verwendet, bei der Ausführung?
  3. Die Header-Datei sensor.h wurde wie oben geschrieben. Welchen Zweck haben die drei Zeilen #ifndef, #define und #endif?
  4. Der obige Code steht in der Funktion main. Welche Ausgabe erzeugt er bei der Ausführung?
  5. Bei einem Mikrocontroller wird das Ausgaberegister wie oben deklariert und verwendet. Welche Aussage über diese Deklaration ist richtig?