【发布时间】:2010-05-19 19:06:01
【问题描述】:
union
{ int i;
bool b;
} x;
x.i = 20000;
x.b = true;
cout << x.i;
打印出19969,为什么打印不出20000?
【问题讨论】:
union
{ int i;
bool b;
} x;
x.i = 20000;
x.b = true;
cout << x.i;
打印出19969,为什么打印不出20000?
【问题讨论】:
union 不是struct。在union 中,所有数据都占用相同的空间,并且可以通过其字段名称将其视为不同的类型。当您将true 分配给x.b 时,您将覆盖20000 的低位。
更具体地说:
20000 二进制:100111000100000
二进制19969:100111000000001
这里发生的情况是,您在 200000 的 8 个低位中放入了一个单字节值 1 (00000001)。
如果使用struct 而不是union,则int 和bool 将有空间,而不仅仅是int,您将看到预期的结果。
【讨论】:
在联合中,所有数据成员都从同一个内存位置开始。在您的示例中,您一次只能真正使用一个数据成员。但是,此功能可用于一些巧妙的技巧,例如以多种方式公开相同的数据:
union Vector3
{
int v[3];
struct
{
int x, y, z;
};
};
这允许您通过名称(x、y 和 z)或作为数组 (v) 访问三个整数。
【讨论】:
ints 之间插入填充,在这种情况下,v[1] 和 v[2] 将不会像预期的那样对应于 y 和 z。
} vs; 的名称。或者尽可能依赖编译器扩展。
工会在任何给定时间仅存储 一个 成员。要获得定义的结果,您只能读取上次写入 联合的同一成员 来自 联合。否则(就像你在这里)官方给出的只是未定义的结果。
有时联合体被有意用于类型双关语(例如,查看构成浮点数的字节)。在这种情况下,由你来理解你得到的东西。这种语言试图给你一个战斗的机会,但它并不能真正保证多少。
【讨论】:
C 中的联合便于不同变量共享内存空间。
因此,当您在 union 中更改任何变量时,所有其他变量的值也会受到影响。
【讨论】: