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?
- A12 34
- B78 56
- 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.