如何检测整数溢出?

16 浏览
0 Comments

如何检测整数溢出?

练习9要求,如果结果不能表示为int类型,就输出一个错误信息。但是,我只是在这里进行整数相加,我能想到导致一个数无法表示为int类型的唯一原因就是整数溢出,整数超过了INT_MAX或小于INT_MIN,但我应该如何检测这个问题呢?

这是我的代码:

#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
    int N = 0;
    vector values;
    cout << "请输入您想要求和的值的数量。" << '\n';
    cin >> N;
    cout << "请输入一些数字" << '\n';
    for (int tempnum; cin >> tempnum; )
    {
        values.push_back(tempnum);
    }
    if (N > values.size())
    {
        cout << "我怎么能加上比您给我的数字还多的数字呢?" << '\n';
    }
    else
    {
        int total = 0;
        for (int i = 0; i < N; i++)
        {
            total += values[i];
        }
    }
}

但我不能仅仅检查total是否超过INT_MAX或INT_MIN,因为INT_MAX + 1或其他数会返回一些随机的负值,所以我真的不确定该如何处理这个问题。

0
0 Comments

整理如下:

如何检测整数溢出?

要检测整数溢出,可以使用一些算术方法。假设我们想知道acc + x > INT_MAX是否成立,其中acc是累加器(到目前为止的总和),x是下一个元素。但是,将它们相加可能会导致溢出。不过,acc > INT_MAX - x是等价的,并且x已经存储为一个int类型。因此,这也不会发生下溢,因为x最多可以是INT_MAX

也就是说,只需要对不等式进行转换,以避免溢出。在这种情况下,从两边减去x

然而,这只适用于正数x,感谢用户interjay指出了这一点。对于负数x,则需要进行减法运算:

acc + (-x) > INT_MAX
acc - x > INT_MAX

这不会发生溢出,因为我们是从acc中减去x。但是它可能会发生下溢,所以问题变成了:

acc - x < INT_MIN
acc < INT_MIN + x

因此,我们可以使用以下代码来检测整数溢出:

int acc = 0;
for (int i = 0; i < N; ++i) {
    int x = values[i];
    if (x >= 0 && acc > (INT_MAX - x)) {
        cout << "ERROR: Overflow.";
        return 1;
    } else if (x < 0 && acc < (INT_MIN - x)) {
        cout << "ERROR: Underflow.";
        return 1;
    } else {
        acc += x;
    }
}

需要注意的是,如果x < 0,这段代码可能会发生溢出。在处理负数x时需要采取不同的方法。

噢,好的,这是一个很好的观点。对于负数,intmin加一个负数总是会发生下溢。你第二个if语句中有一个打字错误。

0