C++ C++;大数溢出检测(无符号长)

C++ C++;大数溢出检测(无符号长),c++,try-catch,overflow,unsigned-long-long-int,C++,Try Catch,Overflow,Unsigned Long Long Int,我处理的是大整数(无符号长整数),需要防范溢出情况。无论是否存在异常,代码都会引发异常: try { unsigned long long y = std::numeric_limits<unsigned long long>::max() - 2; unsigned long long z = 1; int size = - 1; if((y+z) ^ y < 0) //If y+z causes overflow its sign will

我处理的是大整数(无符号长整数),需要防范溢出情况。无论是否存在异常,代码都会引发异常:

try
{
    unsigned long long y = std::numeric_limits<unsigned long long>::max() - 2;
    unsigned long long z = 1;
    int size = - 1;
    if((y+z) ^ y < 0) //If y+z causes overflow its sign will be changed => y and (y+z) will have opposite signs
        throw std::overflow_error("overflow of y+z");
    //int* myarray= new int[size]; VS Debug Library catches it earlier than catch()
    printf("%d\n", y*(y+z));
}
catch(exception& e)
{
    cout << e.what() << endl;
}
试试看
{
无符号长y=std::numeric_limits::max()-2;
无符号长z=1;
整数大小=-1;
if((y+z)^y<0)//如果y+z导致溢出,其符号将更改=>y,(y+z)将具有相反的符号
抛出std::溢出_错误(“y+z溢出”);
//int*myarray=newint[size];VS调试库比catch()更早捕获它
printf(“%d\n”,y*(y+z));
}
捕获(例外和e)
{
cout y和(y+z)将有相反的符号
抛出std::溢出_错误(“y+z溢出”);
//int*myarray=newint[size];VS调试库比catch()更早捕获它
printf(“%d\n”,(y+z));
}
捕获(例外和e)
{

cout
y<0
将始终为假,任何xor 0都将始终是那个东西(您是否错过了那个
y<0
将始终为假,任何xor 0都将始终是那个东西(你错过了吗?
你有两个问题。主要问题是:
你有两个问题。主要问题是:
谢谢。我更改了代码(见原始帖子)。如果你知道一个整洁的窍门,请发布:谢谢。我更改了代码(见原始帖子)。如果你知道整洁的窍门,请发布:相关:相关:
try
{
    unsigned long long int y = std::numeric_limits<unsigned long long int>::max() - 2;
    unsigned long long int z = std::numeric_limits<unsigned long long int>::max() / 2;
    unsigned long long delta = std::numeric_limits<unsigned long long int>::max() - y;
    int size = - 1;
    if(z > delta) //If y+z causes overflow its sign will be changed => y and (y+z) will have opposite signs
        throw std::overflow_error("overflow of y+z");
    //int* myarray= new int[size]; VS Debug Library catches it earlier than catch()
    printf("%d\n", (y+z));
}
catch(exception& e)
{
    cout << e.what() << endl;
}
if ( (y+z) ^ (y < 0) )
if (y+z)
if (((y+z) ^ y) < 0) { ... }