代码之家  ›  专栏  ›  技术社区  ›  migo101

整数溢出就是那个恶魔吗?

  •  0
  • migo101  · 技术社区  · 4 年前

    考虑以下代码

    #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\u MAX的任何内容输入k)

    5 1234567891564
    1 2 3 4 5
    

    打印程序

    0
    0 0 0 0 0
    

    实际发生了什么?我们不使用 k 完全

    1 回复  |  直到 4 年前
        1
  •  6
  •   463035818_is_not_an_ai    4 年前

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

    int k = 1234567891564;
    

    实际上,在这一行

    cin >> n >> k;
    

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

    一旦流处于错误状态,所有后续调用 操作员(>)&燃气轮机; 也会默默地失败。在获取输入后,应该始终检查流的状态。例如:

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