一个杯子,当装满水,而你继续往里面装的时候,水就会溢出来,同理,一个变量的存储容量是有限的,如果装过大,就会溢出。
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
显示和实际是有差距的。