首页 新闻 会员 周边 捐助

C语言中的强制类型转换的原理是什么?

0
悬赏园豆:30 [已关闭问题] 关闭于 2012-09-18 15:17

如把一个16进制整数,转换成浮点数,那么使用地址的强制转换可以做到,如:

int a = 0x42500000;
float *f = (float *)&a;

printf("%f", *f); //显示为52.00000

但是直接对变量进行类型强制转换,就不行,如:

int a = 0x42500000;
float f = (float)a;

printf("%f", f); //显示为0.00000

求原因。


朝雾之归乡的主页 朝雾之归乡 | 初学一级 | 园豆:71
提问于:2012-02-15 12:55
< >
分享
所有回答(2)
0

你用的是什么编译器,第二段代码16进制的0x42500000转换后为1112539136.000000

artwl | 园豆:16736 (专家六级) | 2012-02-17 17:44

不好意思,我写错了,第二段代码中转换后的结果是1112539136.000000;

但是为什么这两种强制类型转换的结果不一致呢?

支持(0) 反对(0) 朝雾之归乡 | 园豆:71 (初学一级) | 2012-02-20 10:53
0

原因找到了

直接对变量进行类型强制转换时,编译器会

1)先将a的值0x42500000当成整型数处理,可以看成当成1112539136;

2)然后将其按照浮点数的格式存储在内存中,可以看成当成1112539136.0(其内存的值是:0X4E84A000);

3)最后将此值按照浮点数通过printf显示出来,即看到的1112539136.000000;

但是如果第一段代码中的方式,即:

1)先将保存整型数的地址转换成浮点数类型的地址,因为只对地址进行了类型转换,地址内保存的内容就仍然保持不变,仍然为0x42500000;

2)然后编译器就会按照浮点数的存储格式解释内存值0x42500000,其值恰好为52.0;

3)最后通过printf将上述值显示出来;

【总结】:直接对数据进行强制转换时,会改变数据在内存中的存储格式,尤其浮点类型和整型数据之间的转换;

朝雾之归乡 | 园豆:71 (初学一级) | 2012-07-10 16:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册