整数溢出有那么邪恶吗?

Is integer overflow that evil?

考虑以下代码

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, k;
  cin >> n >> k;
  vector<int> a(n);
  int sum = 0;
  for (auto &it : a) {
    cin >> it;
    sum += it;
  }
  cout << sum << "\n";
  for (int i = 0; i < n; i++) {
    cout << a[i] << " ";
  }
  cout << endl;
}

输入 like(或大于 INT_MAX 的任何内容到 k)

5 1234567891564
1 2 3 4 5

使程序打印

0
0 0 0 0 0

究竟发生了什么?我们根本不使用 k 的值。

您的代码中实际上没有整数溢出。好吧,从更广泛的意义上讲,它是存在的,但从更狭义的意义上讲,整数溢出会发生,例如:

int k = 1234567891564;

实际发生的是这一行

cin >> n >> k;

operator>> 尝试读取 int 但失败了。 1234567891564 从未实际分配给 k。当读取输入失败时 0 将被分配。因此 k 结果为 0.

一旦流处于错误状态,所有对 operator>> 的后续调用也将默默地失败。您应该始终在输入后检查流的状态。例如:

 if (std::cin >> n) {
     // input succeeded use the value 
 } else {
     // input did not succeed. 
     std::cin.clear(); // reset all error flags
 }