笔记:整数计算溢出

 读《深入理解计算机系统》 第二章 信息的表示与处理

  • 检查2个无符号数相加是否溢出
1 bool checkUAddOverflow(unsigned int x,unsigned int y)
2 {
3     return x+y < x;
4 }

 

  • 检查2个有符号数相加是否溢出 
 1 bool checkAddOverflow(int x,int y)
 2 {
 3     int sum = x+y;
 4     bool neg = x < 0 && y < 0 && sum > 0;
 5     bool pos = x>=0 && y>= 0 && sum < 0;
 6     return neg || pos;
 7 
 8 }
 9 
10 bool checkAddOverflow2(int x,int y)
11 {
12     return (x < 0 == y < 0) && (x+y < 0 != x < 0);
13 }
14 

 

  • 检查2个有符号数相减是否溢出

注意不要用试图转化为加法进行溢出判断,比如checkAddOverflow(x,-y),因为-INT_MIN是溢出的

 1 bool checkSubtractOverflow(int x,int y)
 2 {
 3     int sum = x-y;
 4     bool neg = x < 0 && y > 0 && sum > 0;
 5     bool pos = x>=0 && y<= 0 && sum < 0;
 6     return neg || pos;
 7 
 8 }
 9 
10 bool checkSubtractOverflow2(int x,int y)
11 {
12     return (x<0 == y >0) && (x-y > 0 == x<0); //x==0要和y<0在一组
13 }

 

  • 检查2个整数相乘是否溢出
 1 bool checkMultOverflow(int x,int y)
 2 {
 3     int t = x*y;
 4     return x!=0 && y!=t/x;
 5 }
 6 
 7 bool checkMultOverflow2(int x,int y) //long long长度大于int的情况,比如int32位,longlong64位
 8 {
 9     long long t = (long long)x*y; //不要写成long long(x*y)
10     return t != (int)t;
11 }

 

转载于:https://www.cnblogs.com/pop-lar/p/3292464.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值