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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值