C语言中为何整型变量以实型变量输出为0?

 我来答
hell_mao
推荐于2017-11-27 · TA获得超过163个赞
知道小有建树答主
回答量:112
采纳率:0%
帮助的人:64.9万
展开全部
1、整形数和浮点数在内存中的存储格式和布局不同(理解浮点数的内存布局和表示方式,请参考:http://blog.csdn.net/songjinshi/article/details/7753777
2、printf在进行参数入栈时是根据实参的类型进行入栈,而不是根据格式化字符中指定的类型,具体入栈过程如以下所示。所以造成入栈实参的类型和实际函数使用的类型不匹配(关键是所占内存的大小不同),所以在具体的解析中就会出现如题所说的结果,因为整形的内存布局在被解析为浮点数时会非常小,因为整形本来是4个字节存储,而被解析为8个字节的浮点数,所以所得的值会非常小,正如浮点数的的表示:非规格化:当E的二进制位全部为0时,N为非规格化形式。

  注意,此时小数点左侧的隐含位为0。 为什么e会等于(1-bias)而不是(-bias),这主要是为规格化数值、非规格化数值之间的平滑过渡设计的。后文我们还会继续讨论。
  有了非规格化形式,我们就可以表示0了。把符号位S值1,其余所有位均置0后,我们得到了 -0.0; 同理,把所有位均置0,则得到 +0.0。非规格化数还有其他用途,比如表示非常接近0的小数,而且这些小数均匀地接近0,称为“逐渐下溢(gradually underflow)”属性。

下面贴出两段反汇编代码,解析参数如何入栈:
printf("%f",45);
00405028 mov esi,esp
0040502A push 2Dh
0040502C push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh)
00405031 call dword ptr [__imp__printf (43C124h)]
00405037 add esp,8

printf("%f",d);(d为整形变量)
00405028 mov esi,esp
0040502A mov ecx,dword ptr [d]
0040502D push ecx
0040502E push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh)
00405033 call dword ptr [__imp__printf (43C124h)]
00405039 add esp,8
0040503C cmp esi,esp
0040503E call _RTC_CheckEsp (439760h)

double a=5,c;
float b;
int d=0x40a00000,y=6;
int *p;
char s=5;

p=&d;

b=(float)a;

printf("%f,%f,%f,%f,%f,%f,%d",b,c,(float)d,s,(float)s,y,y);
00405028 mov esi,esp
0040502A mov ecx,dword ptr [y]
0040502D push ecx
0040502E mov edx,dword ptr [y]
00405031 push edx
00405032 movsx eax,byte ptr [s]
00405036 mov dword ptr [ebp-34h],eax
00405039 fild dword ptr [ebp-34h]
0040503C sub esp,8
0040503F fstp qword ptr [esp]
00405042 movsx ecx,byte ptr [s]
00405046 push ecx
00405047 fild dword ptr [d]
0040504A sub esp,8
0040504D fstp qword ptr [esp]
00405050 sub esp,8
00405053 fld qword ptr [c]
00405056 fstp qword ptr [esp]
00405059 fld dword ptr [b]
0040505C sub esp,8
0040505F fstp qword ptr [esp]
00405062 push offset _ORDER_SERVER_ADDRESS-0C4h (43F2ACh)
00405067 call dword ptr [__imp__printf (43C124h)]
0040506D add esp,30h
00405070 cmp esi,esp
00405072 call _RTC_CheckEsp (439780h)
空若聚ae3
2015-05-05 · TA获得超过1273个赞
知道小有建树答主
回答量:3131
采纳率:12%
帮助的人:717万
展开全部
实型变量是嘛,只听过实参和形参
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
漠影歌
2015-05-05 · TA获得超过807个赞
知道小有建树答主
回答量:483
采纳率:50%
帮助的人:452万
展开全部
楼主打错了吧,把代码粘贴出来看看,直接问很难理解
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式