【学习随笔】关于计算中int 正负数溢出判定

    科技2025-11-03  9

    通常在计算过程中会遇到int 32位是否溢出判定:

                int正数的范围是2147483647,负数的范围为-2147483648 

    (1)无符号整数相加

    int uadd_ok(unsigned x, unsigned y){    unsigned z = x + y;    if(z < x)      return 0;     return 1; }

    (2) 有符号整数相加,这个要复杂一些

    int add_ok(int x, int y){    int z = x + y;    if(x > 0 && y > 0 && z < 0) //正数加成负数肯定不正常      return 0;      if(x < 0 && y <  0 && z > 0)//负数加成正数肯定不正常      return 0;     return 1; }

     

     

    计算过程中的res是否溢出有以下两种可能性:

    正数有如下几种情况:

    res < INT_MAX/10,这种情况无论t为多大,都不会溢出;

    res > INT_MAX/10,这种情况无论t为多小,一定会溢出;

    res == INT_MAX/10,其中INT_MAX=2147483647,所以当t>7时,会发生溢出;

    负数有如下几种情况:

    res > INT_MIN/10,这种情况无论t为多大,都不会溢出;

    res < INT_MIN/10,这种情况无论t为多小,一定会溢出;

    res == INT_MIN/10,这种情况t若为-9,一定会溢出;

    至于为啥和 INT_MAX/10 比较,很简单的道理 A为任意数【0-9】

                                    由于7小于8,所以一定 70+Ai (取9)< 80+Aj(取0)

                                                                                       79<80   

    Processed: 0.016, SQL: 8