重学C第七节 : 数据的溢出

一个杯子,当装满水,而你继续往里面装的时候,水就会溢出来,同理,一个变量的存储容量是有限的,如果装过大,就会溢出。

 1 #include <stdio.h>
 2 
 3 void main()
 4 {
 5     short int a=32767;
 6     short int b;
 7     b=a+1;
 8 
 9     printf("%d   %d \n",a,b);
10 }

结果是:32767   -32768

也就是说a最大就只能是32767了,如果再大,就变成其他数据了,这不是我们期望的。

 1 mov     [ebp+var_4], 32767
 2 movsx   eax, [ebp+var_4]
 3 add     eax, 1
 4 mov     [ebp+var_8], ax
 5 movsx   ecx, [ebp+var_8]
 6 push    ecx
 7 movsx   edx, [ebp+var_4]
 8 push    edx
 9 push    offset Format   ; "%d   %d \n"
10 call    _printf

看下高级语言代码:

 1 int __cdecl main()
 2 {
 3   char v1; 
 4   __int16 v2; 
 5   __int16 v3; 
 6 
 7   memset(&v1, 0xCCCCCCCCu, 0x48u);
 8   v3 = 32767;
 9   v2 = -32768;
10   printf("%d   %d \n", 32767, -32768);
11   return _chkesp();
12 }

====================================================================================

下面看看Release版的情况

1 ; int __cdecl main(int argc, const char **argv, const char **envp)
2 _main proc near
3 push    0FFFF8000h      ;这里打印b
4 push    7FFFh           ;这里打印a
5 push    offset aDD      ; "%d   %d \n"
6 call    sub_401020
7 add     esp, 0Ch
8 retn
9 _main endp

显示和实际是有差距的。

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