c++ 共用体的覆盖问题

来源:百度知道 编辑:UC知道 时间:2024/05/21 00:17:15
各位大哥,高人新年好,
小弟有一个问题思考了很久,都未搞清楚,
请各位做一下好心,帮一下忙,
小弟将会永忘于心,谢谢!

程序是:
#include<iostream.h>
union udata{
char c;
int i;
double d;
}u1;

void main()
{cout<<"size is "<<sizeof(u1)<<endl;
u1.d=2097153;
cout<<"udata="<<u1.c<<'\t'<<u1.d<<'\t'<<u1.i<<endl;
}

以上是一个共用体程数,据书本上说如果我赋值给d时,将覆盖i的值,

以上我调用2097153,输出是-2147483648

请问是怎样覆盖法呢?

一个union中的各个成员共用一片内存。按所给的例子,就是说u1.c, u1.i, u1.d的起始地址是一个。
注意u1.c占用一个字节;u1.i占用四个字节,u1.d占用八个字节。因此,u1总共占用八个字节。
u1.c使用这一片内存(8个字节)的第一个字节;
u1.i使用这一片内存(8个字节)的前四个字节;
u1.d使用这一片内存(8个字节)的全部八个字节。
u1.d=2097153,d是double型,2097153转换成double的十六进制是 414000080000000. 按照80x86的字节顺序,这八个字节排列为:
00 00 00 80 00 00 40 41
因此,
u1.c是"00",
u1.i是"00 00 00 80", 即0x80000000. 转换成十进制就是 -2147483648.
u1.d是0x4041000080000000, 即2097153.0, 或2.09715e+06.
因此,如果赋值给一个union中的任意一个成员,都有可能影响其他成员。

这个问题。。。
你先查查双精度的位是怎么分配的,在这里因为u1.c指向的是0,所以输出中看不到,而u1.i指向的应该是10 00 00 00 H,也就是整型(现在一般整型和长整型一样了都是四字节)的绝对值最大的负数-2147483648