Basis van programmeren in 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 en uint8_t zijn integertypen zonder teken van 32 en 8 bits, en de omgeving is little-endian. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?

  1. A12 34
  2. B78 56
  3. C87 65
Antwoord en toelichting tonen

Antwoord: B. 78 56

De members van een union overlappen elkaar vanaf hetzelfde adres, dus u.b[0] tot u.b[3] stellen elk een van de 4 bytes van u.w voor. Little-endian plaatst de minst significante byte op het laagste adres, dus 0x12345678 ligt vanaf het laagste adres als 78, 56, 34, 12. Daarom is u.b[0] gelijk aan 0x78 en u.b[1] gelijk aan 0x56. Een andere member lezen dan die waarnaar is geschreven, kan zo worden gebruikt om de bytevolgorde te onderzoeken, maar het resultaat hangt af van de endianness.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. Wat is de uitvoer als de bovenstaande code, die 9 opslaat in een bitveld van 3 bits, wordt uitgevoerd?
  2. Wat is de uitvoer als de bovenstaande code, die de met #define gedefinieerde macro SQUARE gebruikt, wordt uitgevoerd?
  3. Het headerbestand sensor.h is geschreven zoals hierboven. Wat is het doel van de drie regels #ifndef, #define en #endif?
  4. Wat is de uitvoer als de bovenstaande code binnen de functie main wordt geschreven en uitgevoerd?
  5. Een uitgangsregister van een microcontroller wordt gedeclareerd en gebruikt zoals hierboven. Welke beschrijving van deze declaratie is juist?