c语言中整型实型是什么,C语言中为何整型变量以实型变量输出为0?[通俗易懂]

c语言中整型实型是什么,C语言中为何整型变量以实型变量输出为0?[通俗易懂]C语言中为何整型变量以实型变量输出为0?答案:3信息版本:手机版解决时间2019-10-0400:45已解决2019-10-0302:31C语言中为何整型变量以实型变量输出为0?最佳答案2019-10-0302:371、整形数和浮点数在内存中的存储格式和布局不同(理解浮点数的内存布局和表示方式,请参考:http://blog.csdn.net/songjinshi/article/de…

大家好,欢迎来到IT知识分享网。

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

答案:3  信息版本:手机版

解决时间 2019-10-04 00:45

已解决

2019-10-03 02:31

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

最佳答案

2019-10-03 02:37

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)

全部回答

1楼

2019-10-03 03:12

你这里首先一个严重问题就是不管什么环境下变长参数接受float和int的长度都不一样

你这里看上去是16位的,int是2字节 float是4字节

第一个printf 除格式需要6字节的参数你只提供了4字节,%f的高2字节是不缺定的值,所以打印出来的float也是不确定的(当然你每次执行这个程序可能会一样,但是改一下调用顺序就不行了)

第二个要求6个字节你给了8个字节,另外第二个printf没理由是0… 16位下应该是39322

2楼

2019-10-03 02:54

实型变量是嘛,只听过实参和形参

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25509.html

(0)
上一篇 2023-07-21 13:33
下一篇 2023-07-25 19:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信