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

时间:2010-05-19 19:06:01

标签: c unions

union
{ int i;
  bool b;
} x;

x.i = 20000;
x.b = true;
cout << x.i;

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

4 个答案:

答案 0 :(得分:31)

union不是struct。在union中,所有数据都占用相同的空间,可以通过其字段名称将其视为不同的类型。当您将true分配给x.b时,您将覆盖20000的低位。

更具体地说:

20000二进制:100111000100000

19969 in binary:100111000000001

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

如果您使用struct代替union,则intbool都有空间,而不仅仅是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中更改任何变量时,所有其他变量的值也会受到影响。