【问题标题】:Detect Integer Overflow Using If Statement [duplicate]使用 If 语句检测整数溢出
【发布时间】:2024-01-12 17:11:01
【问题描述】:

编辑(重要):这个问题比被标记为重复的问题更具体。这是在询问如何使用布尔函数来做到这一点。但现在我知道它只是不能那样工作。这个问题表明a + b = c只能在你写if(c - b == a)的情况下进行溢出检查,并且没有独立于操作员的检查方式。

一旦发生溢出,就无法检测到

-罗罗

我一直在寻找一种在 C++ 中使用 if 语句检测整数溢出的方法。

可能的伪代码:

#include <iostream>
#include <...>

using namespace std;

bool isOverflow(...);

int main()
    {
    int a = INT_MAX + 1;

    if (isOverflow(...))
    {
        cout << "Overflow" << endl;
    }
    else
    {
        cout << "No Overflow" << endl;
    }
    return 0;
}

bool isOverflow
{
    ...
}

老实说,这个伪代码偏好可能不起作用,但我已经看到这个问题被问了很多次,但没有找到任何有用的答案。它可能需要unsignedunsigned long long,尽管我不一定鼓励使用它们。

编辑:

我想将它与 3 个数字的乘法句子一起使用:

a * a * b

我知道&lt;math.h&gt; 中有一个pow 函数,但这是题外话。

我也知道,如果我想要来自 pow 的准确 int 结果,我会使用:

int(pow(base, index) + 0.5)

【问题讨论】:

标签: c++ error-handling int overflow detection


【解决方案1】:

这取决于您使用的操作类型以及操作数的类型。

例如如果你想在加法后检测溢出,并且两个操作数都是无符号整数,那么如果结果小于两个操作数之和,就会发生溢出。

bool overflow;
if (a+b < a)
   overflow = true;
else
   overflow = false;

有符号整数可以参考优秀帖子here

【讨论】:

  • 我想在 3 个编号的乘法句子中使用它:a * a * b。当我看到对你的回答投了反对票时,我开始怀疑了。
  • 有些 CPU 带有溢出标志,但 C++ 似乎无法访问该标志。我想最好的方法是反向进行计算,看看我是否得到相同的起始数字。
  • 将两个 uint32_t 相乘的另一个选项是将结果放入 uint64_t 并检查结果是否小于 2^32。对于 3 次乘法,您应该首先使用 2 次乘法的过程,然后对结果和第 3 个值使用相同的过程。