笔记:整数计算溢出

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

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

 

你可能感兴趣的:(笔记)