关于网友提出的“ 将浮点型的数值用整型输出为何是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