求解释

cane1991 2010-07-09 05:02:43

#include<stdio.h>
#include<conio.h>
void main()
{
float a=3.0;
int b;
a=(int)a;
b=a;
printf("%d %d\n",a,b);
//getch();
}

程序调试的时候b变成了3,但是输出却为1074266112
然后就是论坛有个人问的,a为什么输出为0?
...全文
120 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
tracyjk 2010-07-10
  • 打赏
  • 举报
回复
学习了mark~
cane1991 2010-07-10
  • 打赏
  • 举报
回复
谢谢楼上各位牛人了~大概明白了,我再好好研究一下!O(∩_∩)O~
WHZ164566780 2010-07-10
  • 打赏
  • 举报
回复

描述的挺形象的嘛 !!!
[Quote=引用 12 楼 gz_qmc 的回复:]
再给你举个例子,假设1个苹果的价值是固定的,就相当于
上面说的16进制数值

1个苹果=7人民币
1个苹果=1美元
1个苹果=100日元
1个苹果=1.8泰铢

现在我告诉你
美元 x=3.0; //这时候计算机其实保存的是3个苹果
泰铢 y=x; //这时候计算机其实保存的还是3个苹果

printf("%日元方式 %人民币方式",x,y);

你觉得会显示3……
[/Quote]
yanghope 2010-07-09
  • 打赏
  • 举报
回复
首先你要明白函数调用的机制:在调用该函数之前编译器会完成一些工作,将参数从右至左依次入栈(如果你不明白可以对可执行文件进行反汇编,看看汇编代码),以便对这些数据进行操作,函数调用完之后再出栈,恢复调用之前的状态。
printf()函数也是函数,依然如此,首先是三个参数入栈,注意float类型入栈时首先转换成double类型的,占用了8个字节,int类型入栈占用了2个字节。你的问题是当你对栈内的数据进行输出时出现了问题,“%d”是输出一个整数,printf()函数通过这个格式化输出符得到的信息是你要输出一个整数,所以就会从栈中找到该参数的位置,取出两个字节,将这两个字节的数据当做整数,进行输出。显然,你只是输出了这个float数据的一部分,再一个“%d”,又会从栈中取出两个字节,当做整数输出。
最后建议你了解一下float数据在内存中的存储方式。
zhangzhao123 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gz_qmc 的回复:]
引用 7 楼 zhao4zhong1 的回复:

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

一次表达你能,二次清楚你强.
三次似乎你狠,四次仿佛你狂.
五次感觉你懒,六次认为你憨.
七次确定你兔,八次知道你烦.
九次暴露你怂,十次显示你烂.
再次说……
[/Quote]

这哥们每次的回帖确实...我就不说了 哎
gz_qmc 2010-07-09
  • 打赏
  • 举报
回复
再给你举个例子,假设1个苹果的价值是固定的,就相当于
上面说的16进制数值

1个苹果=7人民币
1个苹果=1美元
1个苹果=100日元
1个苹果=1.8泰铢

现在我告诉你
美元 x=3.0; //这时候计算机其实保存的是3个苹果
泰铢 y=x; //这时候计算机其实保存的还是3个苹果

printf("%日元方式 %人民币方式",x,y);

你觉得会显示3 3吗?
feilongjilei 2010-07-09
  • 打赏
  • 举报
回复
在内存中存在还是那个数,只是被解释成不同的形式了
float用%d输出,验证了一下,的确是0
gz_qmc 2010-07-09
  • 打赏
  • 举报
回复
union XXX
{
float a;
int b;
char ch[4];
}Val;

//这样a,b,ch的数据都是同一数据
void main()
{
Val.a=3.0;
printf("%02x %02x %02x %02x\n",ch[0],ch[1],ch[2],ch[3]);
//这样你就看到这个数的16进制数据了
Val.b=1;
printf("%02x %02x %02x %02x\n",ch[0],ch[1],ch[2],ch[3]);
Val.b=2;
printf("%02x %02x %02x %02x\n",ch[0],ch[1],ch[2],ch[3]);
Val.b=3;
printf("%02x %02x %02x %02x\n",ch[0],ch[1],ch[2],ch[3]);
//这样你就可以看到不同的数他的十六进制是如何变化的
//同样的一个16进制,不同的解析方式结果是不一样的
}


huleiak47 2010-07-09
  • 打赏
  • 举报
回复
编译器在编译printf时,会把后面的所有整形数据扩展到4个字节(long型),所有浮点数扩展到8个字节(double型), 所以当调用 printf("%d %d\n",a,b); 时,b是int型参数(4字节),先压栈,a是float型参数,它被扩展成double型数据(8字节),再压栈。而在printf内部,它是根据第一个字符串参数来判断参数类型的,它看到有两个%d, 就认为传入了两个整型数据。于是它只取出了最后压入栈的8个字节(即a被扩展后的值),把这8个字节看成两个4字节的整数,最后生成的新字符串就是 "0, 1074266112"。
大家可以看看double型的浮点数3.0在内存中的排布:
00 00 00 00 00 00 08 40
因为x86是小端芯片,前4个字节的整数值正好是0, 后4个字节的整数值正好是1074266112。
以上,希望能解释你的困惑。
gz_qmc 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
[/Quote]
一次表达你能,二次清楚你强.
三次似乎你狠,四次仿佛你狂.
五次感觉你懒,六次认为你憨.
七次确定你兔,八次知道你烦.
九次暴露你怂,十次显示你烂.
再次说明你贱,还来证实你装.

故作高深现世,答非所问出场.
只管显摆自己,不想实在帮忙.
翻来覆去一句,横行霸道论坛.
两次无关痛氧,量多情绪不安.
树不长皮无命,人不要脸非凡.
面对装B 无赖,难道只有投降?

如有同感朋友,一起过来谈谈.
打击回贴混混,你我任重道长.
如今我当炮灰,希望你等跟上.
顶帖等于顶我,骂死这些无良.
发现妖孽泛滥,你我紧跟不放.
还是觉得不爽,续写几句玩玩.
赵4老师 2010-07-09
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
pingpo 2010-07-09
  • 打赏
  • 举报
回复

float c=3.0;
printf("%d /n",c); //这简单的两句 C输出是 0.别被之前的a=(int)a搞乱。
楼主可以一句一句,%f %d 之间变换着折腾。
期间在了解一下 int float 等等类型转化之间的规则
在深入一下%f %d这些格式化输出的本质。
vanchristin 2010-07-09
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<conio.h>
void main()
{
float a=3.5;
int b;

a=(int)a; //这句,先把a强制转换成整型,再把这个整型值赋给a(a为float型)
b=a; //这句,把float型的a的值赋给整型的b
printf("%d %f\n",a,b); //至于结果,我也解释不了,要先弄明白浮点数在内存中的表示

//getch();
}
liutengfeigo 2010-07-09
  • 打赏
  • 举报
回复
canshui 2010-07-09
  • 打赏
  • 举报
回复
然后就是论坛有个人问的,a为什么输出为0

呵呵,这个问题论坛上有好多帖子,你找下吧……
flight9 2010-07-09
  • 打赏
  • 举报
回复
float型用%d输出就是0嘛, 只能用%f才对.
tanweiwu 2010-07-09
  • 打赏
  • 举报
回复
你的a是float的,你使用printf的时候使用了%d的解析方式,就出问题了嘛!
有兴趣你自己去看printf的源代码是怎么实现这个解析的过程的。
float a=3.0;
int b;
a=(int)a;
b=a;
printf("%d %d\n",a,b);
你在这里即使输出错了,但是对a,b并没有影响。
你在按正确的格式输出
printf("%f %d\n",a,b);应该为3.000000 3

69,373

社区成员

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

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