float型用int打印的奇怪问题

guoxuqu 2011-01-18 08:40:35
#include <stdio.h>
int main()
{
float f =5.5;
printf("%d\n",*(int *)&f); //这里输出一个很大的数
printf("%d\n",f);//这里打印出0 为什么
return 0;

}


输出结果


1085276160
0
我的问题是第二个printf为什么输出0?
...全文
314 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdyxslj 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guoxuqu 的回复:]

刚发完贴,就发现答案了,贴出来跟大家分享一下

include
int main()
{
float a = 12.5;
printf("%d\n", a);
printf("%d\n", (int)a);
printf("%d\n", *(int *)&a);
return 0;
}
参考答案:该项程序输出如下所示, 0 12 1095237632 原因是:浮点数……
[/Quote]

终于明白了。多谢。
appx 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangchensong 的回复:]

你打的不是地址吗
[/Quote]
人家是通过指向存储数据的地址,然后在从指向位置开始按照整形来取的一个值,记得区分*的不同用法的作用。
dulein 2011-01-19
  • 打赏
  • 举报
回复
谢谢分享,正好遇到这个问题,学习了!
AnYidan 2011-01-19
  • 打赏
  • 举报
回复
printf("%d\n",*(int *)&f); 用int数的格式去解释一个float
printf("%d\n",f); 用强制数据类型变换的方法将一个float 截取成int

补充float的存储格式,lz可在网上搜一下

bluesky12312388 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guoxuqu 的回复:]

刚发完贴,就发现答案了,贴出来跟大家分享一下

include
int main()
{
float a = 12.5;
printf("%d\n", a);
printf("%d\n", (int)a);
printf("%d\n", *(int *)&a);
return 0;
}
参考答案:该项程序输出如下所示, 0 12 1095237632 原因是:浮点数……
[/Quote]
知道就好了
hbprotoss 2011-01-19
  • 打赏
  • 举报
回复
去看看IEEE的float表示方法就知道了
wangchensong 2011-01-18
  • 打赏
  • 举报
回复
你打的不是地址吗
stjay 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tzxx 的回复:]
不过输出的那个0确实不知为何?
[/Quote]

是因为这里printf("%d\n",f);的f被转成double
再看2楼说明
tzxx 2011-01-18
  • 打赏
  • 举报
回复
试了一下,通过float 5.5在内存中的存储,不难解释那个“很大”数的出现。
不过输出的那个0确实不知为何,学习了
guoxuqu 2011-01-18
  • 打赏
  • 举报
回复
刚发完贴,就发现答案了,贴出来跟大家分享一下

include
int main()
{
float a = 12.5;
printf("%d\n", a);
printf("%d\n", (int)a);
printf("%d\n", *(int *)&a);
return 0;
}
参考答案:该项程序输出如下所示, 0 12 1095237632 原因是:浮点数是4个字节,12.5f 转成二进制是:01000001010010000000000000000000,十六进制是:0x41480000,十进制是:1095237632。所以,第二和第三个输出相信大家也知道是为什么了。而对于第一个,为什么会输出0,我们需要了解一下float和double的内存布局,如下:

float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)
double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)
然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存二进制完全不一样。别忘了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以:

float版:0x41480000 (在内存中是:00 00 48 41)
double版:0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)
而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。 这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。
JJF 2011-01-18
  • 打赏
  • 举报
回复
int型可以隐式转换为float型,但float型不能转换为int型。
至于第一个,可以这样试一下printf("%d\n",(int)f);或printf("%d\n,*((int *)&f)");

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧