整数溢出有那么邪恶吗?
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
}
考虑以下代码
#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
}