您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 将浮点型的数值用整型输出为何是0

将浮点型的数值用整型输出为何是0

来源:网络整理     时间:2016/7/25 20:40:18     关键词:

关于网友提出的“ 将浮点型的数值用整型输出为何是0”问题疑问,本网通过在网上对“ 将浮点型的数值用整型输出为何是0”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 将浮点型的数值用整型输出为何是0
描述:

code

#include
void main()
{
float a=1.0;
a++;
printf("%d\n",a);
}

这个问题的关键估计是浮点型在内存中是如何存储的
还有就是%d 是如何读取的 
这两点 我都不怎么明白 忘指教
解决方案1:


4:        float a=1.0;
00401018   mov         dword ptr [ebp-4],3F800000h
5:        a++;
0040101F   fld         dword ptr [ebp-4]
00401022   fadd        dword ptr [__real@4@3fff8000000000000000 (00411128)]
00401028   fst         dword ptr [ebp-4]
6:        printf("%d\n",a);
0040102B   sub         esp,8
0040102E   fstp        qword ptr [esp]
00401031   push        offset string "%d\n" (00411124)
00401036   call        printf (00401050)
0040103B   add         esp,0Ch

float内存中就是占4个字节,和int一样,double的话是8个字节,这貌似是ieee的标准,上面汇编4也可以看出来,运算的话是通过浮点协处理器来的,运算好了以后的值是一个qword,8字节,double的存储方式,然后开辟一个8字节的栈当参数,call printf,
参数是完好的传入的,printf函数用个n来接受参数,
Return Value
On success, the total number of characters written is returned.
On failure, a negative number is returned. 负数则说明函数返回失败。
返回是2,那么应该printf成功的,0的话可能是截断了吧,就如8楼阿荣所写,8字节浮点在内存中应该是第一位符号位,后面11位为指数位,后面的为尾数,而intel的机器是小尾的,那么后面4个字节被取出,那么就截断到0了,因为a++的结果是1.00000
所以就打印出0了,
其中我还发现一个问题,就是a++ 和a= a+1.0是不同的,后者为2.00000,前者没有发生变化,所以打印出来的都是0,调试器为vc6.0 
完毕,有错还请纠正。

以上介绍了“ 将浮点型的数值用整型输出为何是0”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2921241.html

相关图片

相关文章