C语言中共用体的问题

2025-02-06 05:51:53
推荐回答(3个)
回答1:

输出123.399963
double类型占8个字节,int类型占4个字节,un_1共用体占8个字节,i成员占用它的前四个字节
执行s1.x=123.4;之后,s1位置内存中存放的值为:
40 5E D9 99 99 99 99 9A(十六进制,左边是高位,右边是低位,你可以查查浮点数是如何表示的,double的前12个二进制位表示阶数,后面的表示尾数)
其中i占用前四个字节(低位的四个字节)即99 99 99 9A这部分
执行s1.i=100;之后,i的位置被修改为100即十六进制的64,s1位置内存变为:
40 5E D9 99 00 00 00 64
这是再把它看做一个double的格式输出就是123.399963

改成s1.x=123.4;printf("%d\n",s1.x);
输出为:-1717986918
由于要求输出一个int,所以printf函数只读取了s1.x的前四个(低位的四个)字节
s1位置的内存为:40 5E D9 99 99 99 99 9A
输出的是99 99 99 9A,按照int类型输出为-1717986918(符号位为1,所以是负的)

同理,改成s1.i=100;printf("%f\n",s1.i);
输出为:0.000000
执行s1.i=100;之后,s1位置的内存为
00 00 00 00 00 00 00 64
按照double类型输出为0.000000

回答2:

输出的不是123.4
因为先给s1.x赋值之后占用了8个字节,如果这时候printf出来则是123.4
但是紧接着对s1.i进行了赋值,也就是对联合体的8个字节中4个字节的内容进行了改变,导致s1.x的内容产生了变化。
如果将两个赋值语句换个次序就会输出123.400...,因为在对s1.x赋值时将8个字节重新填写

回答3:

楼主别相信Printf打出来的东西。
这样说吧:
int i=123;
double j=123.0;
printf("%%.02f,%f",i,j);
你打出来的i和j是相同的。但是学过c语言的都知道i和j相等么?不相等。
再者,int i= '0x41';
printf("%c",i);
还能打出字母a呢。
所以不要纠结printf,纠结的是内存数据的使用。