union a
{
int x;
char a[2];
}
如果我们为 x 分配 512 值并尝试打印 a[0] 和 a[1] 那么输出将是什么,请解释一下如何?
根据标准,写入联合的一个成员,然后从另一个成员读取的结果没有定义。几乎任何事情都可能发生。
实际上,如果您在 little-endian 机器上运行代码,a[0] 可能是 0,a[1] 可能是 2。在 16 位 big-endian 机器上,a[0] 可能是 2并且 a[1] 将为 0。在 32 位大端机器上,(不存在,正如您所定义的那样)a[2] 将为 2,并且 a[0]、a[1] 和 &a [3] 为 0。
我取决于平台的字节序。在 little-endian 平台 (Intel) a[0] 将具有整数的最低有效字节(4 个字节),因此 a[0] 将保存 0x00 和 a[1] 0x02
这取决于您运行它的计算机的字节序:
union 实际上为您的 int 和您的 chars 使用相同的内存,因此,
整数 512(即 0x200) char[4] 0x00 0x00 0x02 0x00 小端,所以 a[0]=0, a[1]=0 char[4] 0x00 0x02 0x00 0x00 大端,所以 a[0]=0, a[1]=2
(实际上,我可能有小端和大端的错误方式)
C 中的联合共享相同的内存空间,即 x 和 a[2] 都从相同的内存位置开始。当您将值分配给其中一个时,另一个将被覆盖。
在您的情况下,当您将 512 分配给 x 时,您也会将其字节写入 char,就像 Fernando Miguélez 刚刚解释的那样......