重学C第八节:浮点数未结束

浮点数?浮点数是什么?浮点数就可以理解为小数。

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的标准,浮点数的定义如下

                    符号位             指数位             小数部分           指数偏移量 

  单精度浮点数 [31]               8位 [30-23]           23位 [22-00]        127 

  双精度浮点数 [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

唉,还是哪天回去翻翻书吧。

原文地址:https://www.cnblogs.com/tk091/p/2483600.html