读《深入理解计算机系统》 第二章 信息的表示与处理
- 检查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 }