【问题标题】:Checking multiple numbers for overflow检查多个数字是否溢出
【发布时间】:2016-01-07 16:15:56
【问题描述】:

我无法检测溢出。 我应该制作一个读取 int c 的程序,然后是 int 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;
}

【问题讨论】:

  • 到目前为止你做了什么?由于措辞,您的任务似乎是一个技巧。即使您在操作 之后检查溢出,也不能使用结果来检查它。您只能使用操作数进行检查。
  • 不要在 cmets 中发布代码。将您的代码放入您的问题中。还要描述你的代码如何表现以及你期望它如何表现..
  • 只要结果好,我在哪里检查溢出都没有关系

标签: c++ integer-overflow


【解决方案1】:

您陷入了尝试使用结果来测试是否存在溢出的陷阱。你实际上不能这样做。有符号整数溢出具有未定义的行为,因此一旦发生,您就已经搞砸了。您必须在操作之前操作之前检查是否存在溢出。

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

那么,我们如何在不使用a * b 的结果的情况下使用方程式呢?我们将使用数学的魔力,最终得到一个等价的等式:a &gt; max / b。我们只使用整数除法运算符,它不会溢出,Nice!现在,等式的等价性仅在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

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

【讨论】:

  • 好的,所以我写了一个代码,在发生溢出后,其余的数字被认为是溢出
猜你喜欢
  • 1970-01-01
  • 2012-11-19
  • 2021-12-02
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2019-01-23
  • 2010-12-12
  • 2014-09-06
相关资源
最近更新 更多