免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 12776 | 回复: 40
打印 上一主题 下一主题

很简单的printf("%f",5) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-07 23:25 |只看该作者 |倒序浏览
#include <stdio.h>
void main(){
        printf("%f\n",5);
        printf("%d\n",5.01);
}

看到一个很简单的程序.
但是它的结果可能是很多人都想不到的..(打印出0,还有一个很大的数)

大家可以试试看..
个人觉得原因如下:
第一个printf();由于参数是5,所以栈里面只空开了四个字节,但"%f"却是要8个字节,于是
从栈中多取了四个字节打印.(但为什么是0呢,不过在linux下不是)
第二个printf();一开始觉得应该能打印出5来,因为是从8个字节里面取4字节打印..但其实
由于浮点数在机器里面有独特的存储形式.所以尽管是取4个字节,但却不是我的认为的5了.

不知道解释是否正确.迷茫了好久...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-04-07 23:28 |只看该作者
这就是 C 啊,说也说不清楚……这就是 C 啊,越学越糊涂……

论坛徽章:
0
3 [报告]
发表于 2007-04-07 23:30 |只看该作者
.

printf("%f\n", (float)5);
或者
printf("%f\n", 5.f);

当然 5.f 里的 f 可以不写,写出来只是为了表明它是个 float

.

论坛徽章:
0
4 [报告]
发表于 2007-04-07 23:33 |只看该作者
原帖由 Iamlangue 于 2007-4-7 23:30 发表
.

printf("%f\n", (float)5);
或者
printf("%f\n", 5.f);

当然 5.f 里的 f 可以不写,写出来只是为了表明它是个 float

.



  正确写法知道的..
就是分析下错误的原因..

[ 本帖最后由 b_liu 于 2007-4-7 23:34 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2007-04-07 23:35 |只看该作者
原因很简单,
printf("%f",5),压栈压了个整型5,能不打出奇怪的结果吗?

论坛徽章:
0
6 [报告]
发表于 2007-04-07 23:37 |只看该作者
除此以外,printf() 的后续参数可以是任意类型的,这使得我们在 printf() 中无法判断来源数据的类型,必须人工处理一下。当然,一些编译器能够给出警告,我们在不依赖编译器警告/错误机制的情况下尚可以利用它来排除一些错误。

论坛徽章:
0
7 [报告]
发表于 2007-04-07 23:38 |只看该作者
但为什么是0呢,不过在linux下不是

分析时要注意浮点数的存储格式,不同于整型哦

PS:不要为这类问题迷茫,有兴趣分析分析,也不错,没弄清楚也没啥关系

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2007-04-07 23:39 |只看该作者
不过,对于X86体系结构来说,函数调用,整型一般往堆栈压,浮点数可能往X87栈寄存器上压

论坛徽章:
0
9 [报告]
发表于 2007-04-07 23:39 |只看该作者
了解..连个printf都得小心..这就是C..呵呵

论坛徽章:
0
10 [报告]
发表于 2007-04-07 23:42 |只看该作者
分析时要注意浮点数的存储格式,不同于整型哦

PS:不要为这类问题迷茫,有兴趣分析分析,也不错,没弄清楚也没啥关系



哦..更懂了..第一个问题也可以用浮点数的存储格式去解释..

谢谢..以后常来这里..呵呵.

[ 本帖最后由 b_liu 于 2007-4-7 23:44 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP