笔记:整数计算溢出

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

  • 检查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 }

 

posted @ 2013-08-30 20:42  _pop  阅读(517)  评论(0编辑  收藏  举报