d'abord voir cet exemple de code:
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
int main()
{
union{
int32_t i32;
uint32_t u32;
int16_t i16[2];
uint16_t u16[2];
int8_t i8[4];
uint8_t u8[4];
} u;
u.u8[3] = 52;
u.u8[2] = 51;
u.u8[1] = 50;
u.u8[0] = 49;
printf(" %d %d %d %d \n", u.u8[3], u.u8[2], u.u8[1], u.u8[0]); // 52 51 50 49
printf(" %x %x %x %x \n", u.u8[3], u.u8[2], u.u8[1], u.u8[0]); // 34 33 32 31
printf(" 0x%x \n", u.i32); // 0x34333231
return 0;
}
l'union est ici juste pour accéder à la mémoire de u
de 6 manières différentes.
vous pouvez utiliser u.i32
pour lire ou écrire comme int32_t
ou
vous pouvez utiliser u.u32
pour lire ou écrire comme uint32_t
ou
vous pouvez utiliser u.i16[0]
ou u.i16[1]
pour lire ou écrire comme int16_t
ou vous pouvez utiliser u.u16[0]
ou u.u16[1]
pour lire ou écrire comme uint16_t
ou
ou comme celui-ci à écrire comme uint8_t
:
u.u8[3] = 52;
u.u8[2] = 51;
u.u8[1] = 50;
u.u8[0] = 49;
et lu comme celui-ci comme int8_t
:
printf(" %d %d %d %d \n", u.u8[3], u.u8[2], u.u8[1], u.u8[0]);
puis la sortie est:
52 51 50 49
et lire comme int32_t
:
printf(" 0x%x \n", u.i32);
puis la sortie est:
0x34333231
comme vous voyez dans cet exemple de code union partage un lieu de mémoire avec plusieurs noms/types.
dans votre exemple de code u.i=0x3132;
ce écrit 0x3132
l'intérieur u.i
mémoire, et selon boutisme de votre système qui est peu endian ici, vous a demandé printf("%s", u.s);
du compilateur, donc nous est un tableau de type char
signifiant pointeur constant type char , donc printf("%s", u.s);
lit u.s[0]
et imprime que sur la sortie stdout
puis lit u.s[1]
et imprime que sur la sortie stdout
et ainsi de suite ..., jusqu'à ce que l'un de ce u.s[i]
est zéro.
c'est ce que fait votre code, donc si aucun d'entre nous [0], nous [1], nous [2], nous [3] n'est nul, la mémoire en dehors de votre union sera lue jusqu'à un zéro trouvé ou système erreur de mémoire error
se produit.
'u.s' n'est pas une chaîne et vous ne pouvez pas utiliser'% s' pour l'imprimer. C'est un comportement techniquement indéfini. Cela dit, considérons que «0x31 == 49 == ''' et' 0x32 == 50 ==' 2'' et j'espère que cela devrait être clair pour vous. – kaylum
Les deux derniers groupes de 8 bits sont (en little-endian) "0011 0010" et "0011 0001" qui en hexadécimal sont "32" et "31" qui en ASCII sont "2" et "1" . –
En supposant que sizeof (int) est 4 sans les bits de remplissage et que l'ordre des octets est peu endian, et le codage ascii, alors ce comportement est défini. – 2501