如何检测整数溢出?
如何检测整数溢出?
练习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或其他数会返回一些随机的负值,所以我真的不确定该如何处理这个问题。
整理如下:
如何检测整数溢出?
要检测整数溢出,可以使用一些算术方法。假设我们想知道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语句中有一个打字错误。