请看以下共用题问题

来源:百度知道 编辑:UC知道 时间:2024/06/16 10:03:42
union dt
{int a;
char b;
double c;}data;

如果,给data.a=5;那么printf("%f\n",data.c);就得0.000000
但是printf("%c",data.b);都有对应的字符,请问一下,为什么data.c输出的不是5.000000呢?
我问的是关于C语言的,不是C++的,请以C语言中的用法回答,因为C++有些看不懂,虽然用法都一样,但语句没看懂也不知道啊.
谢谢!

这跟主要是由于double的存储方式与int和char是不一样的,象data.a=5,那么这个union的内存段的最低位是5,而如果输出printf("%c",data.b),对char类型也是从低位读起的,所以输出ASCII码是5的字符。
而对printf("%lf\n",data.c);(注意输出double类型应该是"%lf")而言,double类型就不同了,具体是怎么个不同,你运行一下下面这个例子就会有体会的:

(1)
data.c=5.0;
data.a=5;
printf("%d",data.a);
printf("%c",data.b);
printf("%.18lf\n",data.c);

它的输出是
0
(不可打印字符)
5.000000...(18个0)

(2)
data.c=5.0;
data.a=5;
printf("%d",data.a);
printf("%c",data.b);
printf("%.18lf\n",data.c);

它的输出是
5
(ASCII值为5对应的字符)
5.000000000000004400

大概能有点体会吧~~

参考:
http://baike.baidu.com/view/109447.html?wtp=tt

a和c的数据类型不一样,而整型和字符型是可以通用的