[英]why *y = z binds y to the mem address, but *y = *x takes only a value?
[英]Why the value of x and y is 1
union test{
unsigned int x: 3;
unsigned int y: 3;
int z;};
int main(){
union test t;
t.x = 5;
t.y = 4;
t.z = 1;
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
return 0;
}
我不明白为什么x和y的值为1,感谢您的帮助。
编辑:谢谢大家的输入,您已经要求输出我现在还没有编译器,我以在线方式编译了代码,这些是输出
for z= 1 : t.x = 1, t.y = 1, t.z = 1
for z= 2 : t.x = 2, t.y = 2, t.z = 2
for z= 10 : t.x = 2, t.y = 2, t.z = 10
for z= 30 : t.x = 6, t.y = 6, t.z = 30
为什么这些奇怪的输出?
编译器为最大的union
成员分配内存。 在这种情况下,将分配z
内存。 由于最后一次赋值使z
具有值1
,因此内存中仅此值将覆盖先前的值。 因此,存储在分配的内存中的最后3位是001
。 访问其他3
位成员将得出结果1
。
对于z
等于2
, 10
,和30
,最后3
位是010
, 010
和110
分别其是等于2
, 2
和6
分别以十进制。
这是一个工会,这就是工会的工作方式。 所有成员变量(x,y,z)都在内存中的同一地址,因此,如果更改一个,则全部更改。 从技术上讲,您应该只阅读您写的最后一篇。 写入z
,然后从x
或y
读取是未指定的行为。
根据C-11规范草案§6.2.6.1
当值存储在联合类型的对象的成员中时,与该成员不对应但与其他成员对应的对象表示形式的字节采用未指定的值。
响应编辑:
10个十进制的低三位是010
二进制,即2个十进制。
30十进制的低三位是110
二进制,即6十进制。
在Union中,我们一次只能使用一个成员。 因此,最后将值分配为1。请在此处参考。
联合会占用该成员中具有最大大小的内存。 因此,从该内存中,所有成员都必须在其中工作。 最后, z
将访问内存,然后将该值设为1。
所有成员将使用相同的内存,因此前两个成员将值设为1。
您可以像这样验证。 分配每个值后进行printf
。
t.x=5;
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
t.y=4
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
t.z=1;
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
没错。
z的最后3位与x和y共享。
对于z = 30 tx = 6,ty = 6,tz = 30
z = 0x1E = 00011110。
tx = 110 = 6
ty = 110 = 6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.