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