13
union
{ int i;
  bool b;
} x;

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

它打印出19969。为什么它不打印出20000?

4

4 回答 4

31

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

进一步来说:

20000 二进制:100111000100000

19969 二进制:100111000000001

这里发生的事情是,您在 200000 的 8 个低位中放入了一个 1 字节的值(00000001)。

如果您使用 astruct而不是 a union,您将有空间容纳 anint和 a bool,而不仅仅是 a int,您将看到预期的结果。

于 2010-05-19T19:07:14.070 回答
3

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

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

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

于 2010-05-19T19:10:04.947 回答
3

工会在任何给定时间仅存储其中一个成员。要获得定义的结果,您只能最后一次写入联合的联合中读取同一成员。否则(就像你在这里)官方给出的只是未定义的结果。

有时联合体被有意用于类型双关(例如,查看构成浮点数的字节)。在这种情况下,由你来理解你得到的东西。这种语言试图给你一个战斗的机会,但它并不能真正保证太多。

于 2010-05-19T19:11:35.690 回答
1

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

于 2011-02-11T13:00:50.107 回答