C语言共同体的问题 union dt{int a;char b;double c;}data;

2024-11-15 18:14:27
推荐回答(5个)
回答1:

(1)共同体在内存中共用一块存储空间,
(2)空间的大小由共同体中占用空间最大的变量所决定
(3)输出时,按相应的类型进行数值解析。
int 占4个字节
char 占一个字节
double占8个字节
所以data所占空间为8字节。

data.a=5;在内存中存储的是二进制格式,X86机器上,低位在前形如:
00000101 00000000 00000000 00000000
此时如果要输出:data.c,则计算机从内存中取信息内容如下:
00000101 00000000 00000000 00000000 XXXX (XXXX代表高四字节,未初始化数据,所以数值有可能不确定)
这个信息:按双精度数据解释为:一位的符号号 + 11位的指数位(移码)+52位小数位
0
(00001010000)移=( E)原+1023 E= -943
即:data.c=1.x * 2^-943 约等于0

回答2:

sizeof(data)知道是多少么?
是8个字节
data.a=5只是给低4个字节赋值为5,但是高4个字节还是0xCCCCCCCC这样没初始化数据
共用体是一个存储单元没有错,
但是%f输出的是8个字节的值,所以不会输出5.000000的

回答3:

当然不是5.000000。因为你输出的格式不对。共用体确实是同一个存储单元。而且大小是最大的那个类型的大小。但是int的格式用单精度形的格式输出的话,会是0.000000。

回答4:

是0.000000
这是和浮点数的编码 有关的,double类型的数据为符号位 1位(0正1负),阶码E 11位,尾数M 52位,共64位。咱们的电脑一般应该都是小端的,那么根据共同体的特性,数据从低地址开始取,data.c在计算机中的存储为
低地址》》》》》》高地址
05 00 00 00 00 00 00 00,前四个字节是data.a;
也就是
0x00 00 00 00 00 00 00 05;
符号位 指数位 尾数位
0 000 0000 0000 0000....0 0101
因为浮点数的阶码都有偏移量,double类型的偏移量为1023,float的为127,所以实际指数为0-1023 = -1023,实际数值的二进制表示为1.0000....0 0101*2^(-1023),这个数的绝对值太小计算机不能表示,按下溢处理,强制为零,所以输出为0.000000;

如果是5.0的话按同样的格式处理 5=0101=1.01*2^2;
指数位=2+1023=1025=100 0000 0001
尾数位=0100 0000...
符号位=0
0 100 0000 0001 0100 0000.....
为0x401400000000
可测试union dt{int a[1];char b;double c;}data; int a[0]=0x0;int a[1]=0x40140000;
输出data.c=5.0

回答5:

输出结果不对吗?应该是多少??你觉得应该是多少?