通常在计算过程中会遇到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