社区
C语言
帖子详情
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?
...全文
443
16
打赏
收藏
float型用int打印的奇怪问题
#include int main() { float f =5.5; printf("%d\n",*(int *)&f); //这里输出一个很大的数 printf("%d\n",f);//这里打印出0 为什么 return 0; } 输出结果 1085276160 0 我的问题是第二个printf为什么输出0?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)");
python输入小数报错_python学习之路之
int
()
奇怪
的报错
今天闲来无事看了下python基础知识,当学到数据类
型
转换的
int
()方法时候。发现了这么一个有意思的事情,算是IDE或是解释器的一个小BUG。(具体原因暂不明,留待以后查找
问题
)先讲下环境操作系统: windows10python版本:3.6.5IDE环境: pycharm edu 2018.1 x64解释器: CPython然后
int
()方法的作用函数说明
int
(x...
拯救pandas计划(12)——转换包含np.nan的
float
64类
型
列为
int
64类
型
拯救pandas计划(12)——转换包含np.nan的
float
64类
型
列为
int
64类
型
最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas,闭口pandas了,故而写下此系列以让更多的小伙伴们爱上pandas。系列文章说明:系列名(系列文章序号)——此次系列文章具体解决的需求平台:windows ...
Claude文件安装啵啵啵啵啵
Claude文件安装啵啵啵啵啵
科技中介服务机构如何借助科创数智大脑优化企业服务能力?.docx
科技中介服务机构如何借助科创数智大脑优化企业服务能力?
国央企创新负责人如何实现跨区域资源协同与联合攻关?.docx
国央企创新负责人如何实现跨区域资源协同与联合攻关?
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章