挺简单的代码,谁来解释下,关于printf

selooloo 2009-12-20 02:00:22

#include <stdio.h>

int main(void)
{
float a=221.0,;
int b=13;
//printf("%f\n",a);
printf("%d\n",b);
printf("%f\n",b);
getchar();
return 0;
}


加上printf("%f\n",a);printf("%f\n",b);就打印出221.0
去掉printf("%f\n",a);printf("%f\n",b);就打印0
这是怎么一回事呢?
...全文
575 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
selooloo 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 hpsmouse 的回复:]
随意 google 了一篇文章:
http://liyanrui.is-programmer.com/posts/3806.html
另外,我记得 CSDN Downdload 里面有 IEEE 754 原文。
[/Quote]
thank you 结贴
2009-12-22
  • 打赏
  • 举报
回复
随意 google 了一篇文章:
http://liyanrui.is-programmer.com/posts/3806.html
另外,我记得 CSDN Downdload 里面有 IEEE 754 原文。
lidowx 2009-12-22
  • 打赏
  • 举报
回复
和编译器有关
jack_wq 2009-12-22
  • 打赏
  • 举报
回复
mark
selooloo 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 hpsmouse 的回复:]
引用 44 楼 selooloo 的回复:
那指数部分是如何扩展呢

晕……
你难道不觉得自己应该先去了解一下浮点数的储存格式……
[/Quote]
我知道float是8位指数,double是11位指数
原来指数位的扩展并不是添0.
tianzhaohui1 2009-12-22
  • 打赏
  • 举报
回复
都是高手啊

学习了!

呵呵
2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 selooloo 的回复:]
那指数部分是如何扩展呢
[/Quote]
晕……
你难道不觉得自己应该先去了解一下浮点数的储存格式……
selooloo 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 hpsmouse 的回复:]
普通浮点数的储存格式是 1.xxxxxxxxxxx*(2^n),底数部分是一个整数部分为 1 的小数。所以对底数进行精度扩展是在后面添零。
double 有 52 位底数,float 有 23位,要添加 29 个零。
[/Quote]
那指数部分是如何扩展呢
happy_yw 2009-12-21
  • 打赏
  • 举报
回复
上边的执行在VC6.0中执行结果是一致的。
没有出现两种情况啊



应该是跟编译器有关系
2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 selooloo 的回复:]
double类型的指数位是在高字节,底数位在低字节?
还想请教下,float是怎么提升到double的,在后面添0?
[/Quote]
从高位到低位依次是
符号位——指数——底数

小端字节序是低位放低地址,高位放高地址。所以低四字节其实是 double 的底数的低 32 位。


printf("%f\n",b);
改成
printf("%.100f\n",b);
多试几个 b 的值,效果会很明显的。
lhy 2009-12-21
  • 打赏
  • 举报
回复
跟浮点数的存储方式有关
fenglingxiaowu 2009-12-21
  • 打赏
  • 举报
回复
顶~~
wolffan3150 2009-12-21
  • 打赏
  • 举报
回复
woyaozixuevcmfc 2009-12-21
  • 打赏
  • 举报
回复
学习了,帮顶下。
selooloo 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 clangfans 的回复:]
float类型提升到double是把低4字节传送到double,然后高字节添零..

还有,LZ如果连这个都不清楚的话,我觉得LZ的C语言基础不是很扎实,谭浩强的那本书貌似有说..
[/Quote]
貌似float是4字节吧,低4字节怎么算呢;
还有double是8字节,共64BIT位,其中1位符号位,11位指数位,52位尾数;低4字节对应的是前面的指数位,还是后面的尾数位呢,麻烦从大小端的角度解释下
macrojj 2009-12-21
  • 打赏
  • 举报
回复
话说 float 到int的格式是非常复杂的哇
2009-12-21
  • 打赏
  • 举报
回复
普通浮点数的储存格式是 1.xxxxxxxxxxx*(2^n),底数部分是一个整数部分为 1 的小数。所以对底数进行精度扩展是在后面添零。
double 有 52 位底数,float 有 23位,要添加 29 个零。
selooloo 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 hpsmouse 的回复:]

从高位到低位依次是
符号位——指数——底数

小端字节序是低位放低地址,高位放高地址。所以低四字节其实是 double 的底数的低 32 位。


printf("%f\n",b);
改成
printf("%.100f\n",b);
多试几个 b 的值,效果会很明显的。
[/Quote]
还想请教下,float提升到double的时候,尾数好像并不是全部填充的0;

float a=0.6;
printf("%x\n",a);

printf("%x\n",a)这句应该是打印a的低32位吧,但结果是0x40000000
换了几个别的数,结果差不多,只是4换成了别的数,后面依然全是0.查了资料也没看到float是如何提升到double的。
能否解释下,谢谢
jernymy 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 clangfans 的回复:]
我记得C primer plus上有说...

刚刚找来看了看,大概意思就是说,你设置的两个变量是存放在堆栈的一块内存区域,假设double a是8字

节,int b是2字节,它们是紧连在内存区域内里的,由于printf("%f\n",a)的调用使printf函数读取了变量

a的前四字节,而printf("%f\n",b);则表明printf需要读取剩下的4字节..但这4个字节是属于变量a剩下

的,因此读取错误...

具体应该是这样吧...

[/Quote]

顶一下
加载更多回复(32)

69,373

社区成员

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

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