社区
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?
...全文
314
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)");
你必须知道的495个C语言
问题
1.3 因为C语言没有精确定义类
型
的大小,所以我一般都用typedef定义
int
16和
int
32。然后根据实际的机器环境把它们定义为
int
、short、long等类
型
。这样看来,所有的
问题
都解决了,是吗? 1.4 新的64位机上的64位类
型
...
float
与
int
相乘产生的令人崩溃的“ 2.3 * 10 = 22 ”
为什么会出现这样的情况呢,因为 a 是一个
float
型
的数据,我们看它是2.3,但是它在内存里就不一定是2.3,它可以是2.29999999999999999,或者2.30000000000000001,因为浮点
型
的范围为-2^128 ~ +2^128,也即-3.40E+38 ...
拯救pandas计划(12)——转换包含np.nan的
float
64类
型
列为
int
64类
型
拯救pandas计划(12)——转换包含np.nan的
float
64类
型
列为
int
64类
型
最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas,闭口pandas了,故而写下...
Python整数类
型
(
int
)、小数/浮点数(
float
)、复数类
型
(complex)
Python整数类
型
(
int
)、小数/浮点数(
float
)、复数类
型
(complex) 1. Python整数类
型
(
int
)详解 整数就是没有小数部分的数字,Python 中的整数包括正整数、0 和负整数。 有些强类
型
的编程语言会提供多种整数...
java double
float
decimal
int
long 等数值
型
类
型
的范围及精度的
问题
但同时也存在误差
问题
,这就是著名的浮点数精度
问题
! 浮点数有多种实现方法,计算机中浮点数的实现大都遵从 IEEE754 标准,IEEE754 规定了单精度浮点数和双精度浮点数两种规格,单精度浮点数用4字节(32bit)表示...
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章