溢出检测

来源:互联网 发布:视频通话软件 编辑:程序博客网 时间:2024/04/27 18:50

 

#include "iostream"

#include "bitset"

#include "limits"

 

using namespace std;

 

#define out2(T) cout<<bitset<numeric_limits<unsigned int>::digits>(T)<<endl

#define SIZE(T) (numeric_limits<unsigned T>::digits)

 

bool SHR31(int x)           //逻辑右移位

{

     return (unsigned int)x>>31;

}

 

unsigned int nlz(unsigned int x) //计算前导数目

{

     int s = SIZE(int);

     unsigned int L = (unsigned int)(1) << (s-1);

     unsigned int i = 0; while ( !(x&L) && i < s) {x<<=1; i++;}

     return i;

}

 

//检测x+y+c 的溢出

//溢出条件xy符号相同,且x+y+c的符号与x相反

bool AOF(int x, int y, int c)

{

//   return SHR31( ~(x^y) & ((x+y+c)^x) );

//   return SHR31( ((x+y+c)^x) & ((x+y+c)^y) );

 

     int z = ~(x^y) & 0x80000000;

     return SHR31( ~(x^y) & ~(((x^z)+y+c)^y) );

}

 

//检测x-y-c 的溢出

//溢出条件xy符号相反,且x+y+c的符号与x相反(或说与y符号相同)

bool SOF(int x, int y, int c)

{

//   return SHR31( (x^y) & ((x-y-c)^x) );

//   return SHR31( ((x-y-c)^x) & ~((x-y-c)^y) );

 

     int z = (x^y) & 0x80000000;

     return SHR31( (x^y) & (((x^z)-y-c)^y) );

}

 

//无符号数x+y+c 的溢出

bool UAOF(unsigned int x, unsigned int y, unsigned int c)

{

//   return SHR31( x&y | (x|y)&~(x+y+c) );

//   return SHR31( (x>>1) + (y>>1) + ( (x&y | (x|y) & c)  & 1 ) );

    

//   if (c) return ~x <= y; else return ~x < y;

     if (c) return x+y+1 <= x; else return x+y < x;

}

 

//无符号数x-y-c 的溢出

bool USOF(unsigned int x, unsigned int y, unsigned int c)

{

//   return SHR31( ~x&y | ~(x^y) & x-y-c );

//   return SHR31( ~x&y | (~x|y) & x-y-c );

//   return   SHR31( (x>>1) - (y>>1) - ( (~x&y | (~x|y) & c) & 1 ) );

 

//   if (c) return x <= y; else return x < y;

     if (c) return x-y-1 >= x; else return x-y > x;

}

 

//有符号x*y 的溢出

bool MOF(int x, int y)

{

     return (y<0 && x==0x80000000) || (y && x*y /y != x);

}

bool MOF1(int x, int y)

{

     unsigned int c = (~(x^y) >> 31) + 0x80000000;

     x = (unsigned int)abs(x);

     y = (unsigned int)abs(y);

     return y && x > (c/y);

}

 

//无符号x*y 的溢出

bool UMOF(unsigned int x, unsigned int y)

{

//   return y && x*y /y != x;

     return y && x > (0xFFFFFFFF / y);

}

 

bool UMOF1(unsigned int x, unsigned int y)

{

     unsigned int m, n, t, z;

     m = nlz(x);

     n = nlz(y);

     if (m + n <= 30) return true;

     t = x*(y>>1);

     if ((int)t < 0) return true;

     z = t*2;

     if (y & 1) {

         z += x;

         if (z < x) return true;

     }

     // z is the correct product of x and y

     return false;

}

 

//有符号x/y 的溢出

bool DOF(int x, int y)

{

//   return !y | (x==0x80000000 && y==-1);

     return (abs(y^0x80000000) | abs(x) & abs(~(y^0x80000000))) < 0;

}

 

bool DOF1(int x, int y)

{

     int z = (x^0x80000000) | (y+1);

//   return ((y|-y) & (z|-z)) >= 0;

//   return (-abs(y) & -abs(z)) >= 0;

     return (nlz(y) | nlz(z)>>5) != 0;

}

 

//无符号x/y 的溢出

bool UDOF(unsigned int x, unsigned int y)

{

     return !y;

}

 

 

 

void test11();

void main()

{

//   test1();

//   test2();

//   test3();

//   test4();

//   test5();

//   test6();

//   test7();

//   test8();

//   test9();

//   test10();

     test11();

}

 

 

 

 

void test11()

{

     unsigned int x, y;

 

     x = 0xFFFFFFFF; y = 1;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = 1; y = 0xFFFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = 0xFFFFFFFF; y = -1;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = -1; y = -0xFFFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = -1; y = -0xFFFF;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = 0xABC; y = 0xFD;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = 0; y = 0;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = 0xFFFFFFFF; y = 0;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

 

     x = 0x7FFFFFFF; y = 0;

     cout << x << " " << y << " " << endl;

     cout << UDOF(x, y) << endl;

}

void test10()

{

     int x, y;

 

     x = 0x7FFFFFFF; y = 0xABCDEFDC;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

 

     x = 1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

 

     x = 0x7FFFFFFF; y = -1;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

 

     x = 0x7FFFFFFF; y = -2;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

 

     x = 0x80000000; y = 1;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

    

     x = 0x80000000; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

    

     x = 0x80000000; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

    

     x = 0x80000000; y = -1;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

 

     x = 0x80000000; y = -2;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

 

     x = 0x80000000; y = 0;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 1;

     cout << x << " " << y << " " << endl;

     cout << DOF1(x, y) << endl;

}

void test9()

{

     int x, y;

 

     x = 0x7FFFFFFF; y = 0xABCDEFDC;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

 

     x = 1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

 

     x = 0x7FFFFFFF; y = -1;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

 

     x = 0x7FFFFFFF; y = -2;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

 

     x = 0x80000000; y = 1;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

    

     x = 0x80000000; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

    

     x = 0x80000000; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

    

     x = 0x80000000; y = -1;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

 

     x = 0x80000000; y = -2;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

 

     x = 0x80000000; y = 0;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 1;

     cout << x << " " << y << " " << endl;

     cout << DOF(x, y) << endl;

}

void test8()

{

     unsigned int x, y;

 

     x = 2; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

    

     x = 0xF; y = 0x11111111;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

    

     x = -1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

    

     x = -1; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

 

     x = 0; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

    

     x = 0; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 0;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

    

     x = 0x80000000; y = 0;

     cout << x << " " << y << " " << endl;

     cout << UMOF1(x, y) << endl;

}

void test7()

{

     unsigned int x, y;

 

     x = 2; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

    

     x = 0xF; y = 0x11111111;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

    

     x = -1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

    

     x = -1; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

 

     x = 0; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

    

     x = 0; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 0;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

    

     x = 0x80000000; y = 0;

     cout << x << " " << y << " " << endl;

     cout << UMOF(x, y) << endl;

}

void test6()

{

     int x, y;

 

     x = 1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = 0x7FFFFFFF; y = -1;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = 0x7FFFFFFF; y = -0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = -1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = -0x7FFFFFFF; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = -1; y = -0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = -1; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

 

     x = 0x80000000; y = -1;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

 

     x = 0x80000000; y = -2;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

 

     x = 0; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = 0; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 0;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

    

     x = 0x80000000; y = 0;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

 

     x = 1<<30; y = 2;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

 

     x = -(1<<30); y = -2;

     cout << x << " " << y << " " << endl;

     cout << MOF1(x, y) << endl;

}

void test5()

{

     int x, y;

 

     x = 1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = 0x7FFFFFFF; y = -1;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = 0x7FFFFFFF; y = -0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = -1; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = -0x7FFFFFFF; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = -1; y = -0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = -1; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

 

     x = 0x80000000; y = -1;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

 

     x = 0x80000000; y = -2;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

 

     x = 0; y = 0x7FFFFFFF;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = 0; y = 0x80000000;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = 0x7FFFFFFF; y = 0;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

    

     x = 0x80000000; y = 0;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

 

     x = 1<<30; y = 2;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

 

     x = -(1<<30); y = -2;

     cout << x << " " << y << " " << endl;

     cout << MOF(x, y) << endl;

}

void test4()

{

     unsigned int x, unsigned int y, unsigned int c;

    

     x = 0xFFFFFFFF; y = 0xFFFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

 

     x = 0x80000000; y = 0x7FFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

    

     x = 0xFFFFFFFF; y = 0x7FFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

    

     x = 0x0FABCDEF; y = 0x1FFBCEDA; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

    

     x = 1; y = 1; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

    

     x = 1; y = 1; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

 

     x = 0; y = 1; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

    

     x = 0; y = 0; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

 

     x = 0; y = 0x80000000; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << USOF(x, y, c) << endl;

}

void test3()

{

     unsigned int x, unsigned int y, unsigned int c;

 

     x = 0x7FFFFFFF; y = 0x7FFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = 0x80000000; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = 0x80000000; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

 

     x = 0xFFFFFFFF; y = 0xFFFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

    

     x = 0xFFFF0000; y = 0x0000FFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

 

     x = 0; y = 0xFFFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

 

     x = 1; y = 0xFFFFFFFF; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

    

     x = 1; y = 0xFFFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

 

     x = 0xA5A5A5A5; y = 0x5A5A5A5A; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

    

     x = 0xA5A5A5A5; y = 0x5A5A5A5A; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << UAOF(x, y, c) << endl;

}

void test2()

{

     int x, y, c;

 

     x = -1; y = 0x7FFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = -2; y = 0x7FFFFFFF; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = -0x5FFFFFFF; y = 0x3FFFFFFF; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = -0x4FFFFFFF; y = 0x30000001; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = -0x4FFFFFFF; y = 0x30000001; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = -0x7FFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = -1; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = 0; y = -0x80000000; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = 0; y = 0x80000000; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = -2; y = -3; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = 1; y = 1; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

 

     x = 1; y = 0x80000000; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << SOF(x, y, c) << endl;

}

void test1()

{

     int x, y, c;

 

     x = 0x7FFFFFFF; y = 1; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = 0; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = 1; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = 0; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 0x7FFFFFFF; y = 0x7FFFFFFF; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 0x80000000; y = -1; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 0x80000000; y = 0x80000000; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 0x80000000; y = 0x80000000; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = -2; y = -3; c = 0;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = 1; y = 1; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

 

     x = -2; y = 0x80000000; c = 1;

     cout << x << " " << y << " " << c << endl;

     cout << AOF(x, y, c) << endl;

}