为什么我的工会没有显示正确的值?

union { int i; bool b; } x; xi = 20000; xb = true; cout << xi; 

打印出19969.为什么不打印出20000?

union不是struct 。 在并union ,所有数据都占用相同的空间,并且可以通过其字段名称将其视为不同的类型。 当您为xb指定true时,您将覆盖20000的低位。

进一步来说:

二进制20000:100111000100000

19969二进制:100111000000001

这里发生的是你将一个字节的值1(00000001)放在200000的8个低位中。

如果你使用struct而不是union ,你将拥有intbool ,而不仅仅是int ,你会看到你期望的结果。

在联合中,所有数据成员都从相同的内存位置开始。 在您的示例中,您一次只能真正使用一个数据成员。 但是,此function可用于一些巧妙的技巧,例如以多种方式公开相同的数据:

 union Vector3 { int v[3]; struct { int x, y, z; }; }; 

这允许您通过名称(x,y和z)或作为数组(v)访问三个整数。

工会只在任何给定时间存储其中一个成员。 要获得定义的结果,您只能最后写入union的union中读取相同的成员。 否则(正如你在这里)正式提供的不仅仅是未定义的结果。

有时,工会被有意地用于类型惩罚(例如,查看构成浮点数的字节)。 在这种情况下,您可以自己理解所获得的内容。 试图给你一个战斗机会的语言类型,但它不能真正保证。

C中的联合便于通过不同的变量共享内存空间。
因此,当您在union中更改任何变量时,所有其他变量的值也会受到影响。