为什么我的工会没有显示正确的值?
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
,你将拥有int
和bool
,而不仅仅是int
,你会看到你期望的结果。
在联合中,所有数据成员都从相同的内存位置开始。 在您的示例中,您一次只能真正使用一个数据成员。 但是,此function可用于一些巧妙的技巧,例如以多种方式公开相同的数据:
union Vector3 { int v[3]; struct { int x, y, z; }; };
这允许您通过名称(x,y和z)或作为数组(v)访问三个整数。
工会只在任何给定时间存储其中一个成员。 要获得定义的结果,您只能从最后写入union的union中读取相同的成员。 否则(正如你在这里)正式提供的不仅仅是未定义的结果。
有时,工会被有意地用于类型惩罚(例如,查看构成浮点数的字节)。 在这种情况下,您可以自己理解所获得的内容。 试图给你一个战斗机会的语言类型,但它不能真正保证。
C中的联合便于通过不同的变量共享内存空间。
因此,当您在union中更改任何变量时,所有其他变量的值也会受到影响。