浮点数?浮点数是什么?浮点数就可以理解为小数。
OK,那什么单精度,双精度又是什么意思呢?都是小数,就是后面能跟的尾巴不一样而已,看谁长。
1 #include <stdio.h> 2 3 void main() 4 { 5 float m=3.14; 6 float n=3.141592653; 7 printf("m=%f \n",m); 8 printf("n=%f \n",n); 9 }
结果是:
1 m=3.140000 2 n=3.141593
看来浮点数也是一样啊,装太多就装不下了。
1 mov [ebp+var_4], 4048F5C3h 2 mov [ebp+var_8], 40490FDBh 3 fld [ebp+var_4] 4 sub esp, 8 5 fstp [esp+5Ch+var_5C] 6 push offset Format ; "m=%f \n" 7 call _printf 8 add esp, 0Ch 9 fld [ebp+var_8] 10 sub esp, 8 11 fstp [esp+5Ch+var_5C] 12 push offset aNF ; "n=%f \n" 13 call _printf
额,这次变化太大,看不出来了,还是F5看下
1 int __cdecl main() 2 { 3 char v1; 4 float v2; 5 int v3; 6 7 memset(&v1, 0xCCCCCCCCu, 0x48u); 8 v3 = 1078523331; 9 v2 = 3.1415927; 10 printf("m=%f \n", 3.1400001); 11 printf("n=%f \n", v2); 12 return _chkesp(); 13 }
我勒个去,看来得研究下浮点数在内存中的存放形式了。
根据IEEE的标准,浮点数的定义如下
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
不过看起来还不是很完整,留下等待补充。
====================================================================================
Release:
1 ; int __cdecl main(int argc, const char **argv, const char **envp) 2 _main proc near 3 push 1074339512 4 push 1610612736 5 push offset aMF ; "m=%f \n" 6 call sub_401030 7 push 1074340347 8 push 1610612736 9 push offset aNF ; "n=%f \n" 10 call sub_401030 11 add esp, 18h 12 retn 13 _main endp
看起来更邪恶。
随带用OD看了下
1 00401000 /$ 68 B81E0940 push 0x40091EB8 2 00401005 |. 68 00000060 push 0x60000000 3 0040100A |. 68 38904000 push rl008.00409038 ; ASCII "m=%f 4 " 5 0040100F |. E8 1C000000 call rl008.00401030 6 00401014 |. 68 FB210940 push 0x400921FB 7 00401019 |. 68 00000060 push 0x60000000 8 0040101E |. 68 30904000 push rl008.00409030 ; ASCII "n=%f 9 " 10 00401023 |. E8 08000000 call rl008.00401030 11 00401028 |. 83C4 18 add esp,0x18 12 0040102B \. C3 retn
唉,还是哪天回去翻翻书吧。