正在检查多个数字是否溢出

Checking multiple numbers for overflow

本文关键字:数字 是否 溢出 检查      更新时间:2023-10-16

我在检测溢出时遇到问题。我应该制作一个程序,读取一个int c,然后读取n对应该相乘的数字。数字相乘后,您需要检查它是否为整数溢出。如果不是溢出,则打印相乘后的数字。

在c++中;

这里有一个例子:

输入:3 2147483647和2147483647

18446744073709551615和2个

666013和1

输出:

4611686014132420609
Overflow!
666013

fin>>c;
for (i=1;i<=c;i++,p=0){
    fin>>a>>b;
    p=a*b;
    if (p/b==a)
        fout<<p<<"n";
    else
        fout<<"Overflow"<<"n";
}


return 0;
}

您已经陷入了试图使用结果来测试是否存在溢出的陷阱。事实上你不能那样做。有符号整数溢出有未定义的行为,所以一旦发生这种情况,你就已经完蛋了。必须使用操作数检查是否存在重载,操作之前。

max为可表示的最大整数。假设操作数为正,则a * b溢出当且仅当a * b > max。但是您不能执行该测试,因为如果a * b溢出,则结果不可用。此外,我们知道没有一个整数大于max,所以测试总是错误的。

那么,在不使用a * b的结果的情况下,我们如何使用该方程呢?我们将利用数学的魔力,得到一个等价的方程:a > max / b。我们只使用整数除法运算符,它不会溢出,尼斯!现在,只有当b != 0。尝试分割max / 0将是一个错误。但是,我们知道a * 0对任何a都不会溢出,所以我们可以简单地实现这种特殊情况。

因此,我们拥有的是:

int a, b;
// don't forget to initialize
if(b && a > INT_MAX / b)
    // overflow, abort!
else
    // no overflow, proceed

这只适用于正输入。我将把它作为一个练习留给读者来实现对所有整数的测试。