Bases de la programmation en 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 et uint8_t sont des types entiers non signés de 32 bits et de 8 bits, et l'environnement est petit-boutiste (little-endian). Quelle est la sortie obtenue en exécutant le code ci-dessus ?

  1. A12 34
  2. B78 56
  3. C87 65
Afficher la réponse et l'explication

Réponse : B. 78 56

Les membres d'une union se superposent à partir de la même adresse : u.b[0] à u.b[3] représentent chacun l'un des 4 octets de u.w. En petit-boutiste, l'octet de poids faible est placé à l'adresse la plus basse : 0x12345678 est donc rangé dans l'ordre 78, 56, 34, 12 à partir de l'adresse la plus basse. u.b[0] vaut ainsi 0x78 et u.b[1] vaut 0x56. Lire un membre autre que celui qui a été écrit permet ainsi d'examiner l'ordre des octets, mais le résultat dépend de l'endianness.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui stocke 9 dans un champ de bits de 3 bits ?
  2. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui utilise la macro SQUARE définie par #define ?
  3. Le fichier d'en-tête sensor.h est écrit comme ci-dessus. Quel est le rôle des trois lignes #ifndef, #define et #endif ?
  4. Quelle est la sortie obtenue lorsque le code ci-dessus est écrit dans la fonction main et exécuté ?
  5. Un registre de sortie de microcontrôleur est déclaré et utilisé comme ci-dessus. Quelle description de cette déclaration est correcte ?