#include<stdio.h>
int main()
{
union emp;
union emp{
int age;
char name[2];
};
union emp e1={512};
printf("%d,%d,%d",e1.age,e1.name[0],e1.name[1]);
return 0;
}
在这里,我试图让联盟成为一个联盟并初始化其第一个成员,即“int age”。据我所知,ANSI C编译器支持这一点。我的问题是为什么我得到像“512,0,2”这样的输出。如果我用513,514和768替换512,我会得到以下oytput。 “513,1,2”, “514,2,2”, “768,0,3”, 现在我可以看到e1.name [0]存储(数字)%256和e1.name [1]存储(数字)/ 256。 如果能够解释为什么以及如何发生这种情况,将不胜感激。 谢谢大家。
答案 0 :(得分:2)
这是未定义的行为,您无法在联合中存储字段并将其作为另一种类型进行检索。因此,你不能真正“期望”这段代码的任何输出,因为就标准而言,任何事情都是可以接受的。
请参阅此问题:A question about union in C
除此之外,由于512是2 ^ 9,假设整数是32位且字符是8位,这只意味着你的架构是小端,因为512是0x200。当您访问e1.name[0]
和e2.name[1]
时,您正在访问存储在内存中的512的前2个字节,显然恰好是0x00(最低有效字节)和0x2(下一个字节后面的字节)最不重要的)。
答案 1 :(得分:1)
这就是工会应该做的事情。它将相同的数据存储在不同的数据类型中。为你的价值观
513 = 0x0201
514 = 0x0202
768 = 0x0300
name[0]
存储最低有效字节,而name[1]
存储最高有效字节。如果你使用的是不同的架构,那么它就会被逆转。
答案 2 :(得分:0)
想象一下:一个联盟可以容纳两个字符或一个整数。如果将int存储到union中,则也可以读出两个char部分,但它们将包含stored int的二进制部分。 因此,在您的示例中,name [0]将包含最初存储的int的低16位,name [1]将包含原始int的高16位。