如果联合的格式不同,C 如何解释来自联合的数据?

How does C interpret data from a union if it's formatted differently?

main()
{
union{
    char i[2];
    struct{
        short age;
    } myStruct;
} myUnion;
myUnion.i[0] = 'A';
myUnion.i[1] = 'B';
printf("%x ", myUnion.myStruct.age);

} 

所以我知道联合只包含其中最大成员的 space - 在这种情况下,char 数组 "i" 和结构 "myStruct" 似乎是相同,所以联合只有两个字节包含字符 'A' 和 'B'。但是,如果此时您尝试读取结构成员 "age" 会发生什么情况?

在过去的日子里,这曾经是 "undefined behavior" 并且理论上可能会使您的系统崩溃或更糟。然而,程序员还是这样做了,并且在 C99 中进行了编纂(参见 Is type-punning through a union unspecified in C99, and has it become specified in C11?),它允许您这样做但没有说明结果是什么或它们是否有意义。

所以,

  • 在现代的 8 位字节 16 位短小端系统上它将打印 4241,

  • 在现代的 8 位字节 16 位短大端系统上,它将打印 4142

  • 如果sizeof(short) > 2那么你有问题,因为age是未初始化的(但是这些系统很少见),

  • 您将在 EBCDIC(您不使用或不关心)上得到不同的结果,

  • 您将在非 8 位字节系统(您不使用或不关心)上得到不同的结果,

  • 如果您的程序为 short...创建陷阱表示,您可以调用未定义的行为...但是,现代系统没有整数的陷阱表示。