zoukankan      html  css  js  c++  java
  • 重学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

    显示和实际是有差距的。

  • 相关阅读:
    Don’t Cross 32 GB!
    Kafka 是如何保证数据可靠性和一致性
    水塘抽样(Reservoir Sampling)问题
    实际场景HBase读写设计与实践
    Spark2.3整合kafka010手动管理offset
    周期性清除Spark Streaming流状态的方法
    Spark状态管理State的应用
    Effective C++
    马尔科夫链模型
    非线性规划
  • 原文地址:https://www.cnblogs.com/tk091/p/2483581.html
Copyright © 2011-2022 走看看