union
{ int i;
bool b;
} x;
x.i = 20000;
x.b = true;
cout << x.i;
打印出19969.为什么不打印20000?
答案 0 :(得分:31)
union
不是struct
。在union
中,所有数据都占用相同的空间,可以通过其字段名称将其视为不同的类型。当您将true
分配给x.b
时,您将覆盖20000
的低位。
更具体地说:
20000二进制:100111000100000
19969 in binary:100111000000001
这里发生的是你把一个字节的值1(00000001)放在8个低位200000中。
如果您使用struct
代替union
,则int
和bool
都有空间,而不仅仅是int
,你会看到你期望的结果。
答案 1 :(得分:3)
在联合中,所有数据成员都从相同的内存位置开始。在您的示例中,您一次只能真正使用一个数据成员。但是,此功能可用于一些巧妙的技巧,例如以多种方式公开相同的数据:
union Vector3
{
int v[3];
struct
{
int x, y, z;
};
};
允许您通过名称(x,y和z)或作为数组(v)访问三个整数。
答案 2 :(得分:3)
联盟仅在任何给定时间存储一个成员。要获得定义的结果,您只能从上次写入到联合的联合读取相同的成员。否则(正如你在这里)正式提供的不仅仅是未定义的结果。
有时,联合会被故意用于类型惩罚(例如,查看构成浮点数的字节)。在这种情况下,由你来理解你得到的东西。这种语言试图给你一个战斗机会,但它并不能真正保证。
答案 3 :(得分:1)
Union in C有助于通过不同的变量共享内存空间 因此,当你在union中更改任何变量时,所有其他变量的值也会受到影响。