首页 > 解决方案 > 我在 C++ 中遇到了一个奇怪的错误,其中计算两个小整数相加的语句溢出到一个 long long 值

问题描述

我最近遇到了一个我无法理解的奇怪的 C++ 错误。这是我的代码:

#include <bits/stdc++.h>
using namespace std;

typedef vector <int> vi;
typedef pair <int, int> ii;

#define ff first
#define ss second
#define pb push_back

const int N = 2050;

int n, k, sum = 0;
vector <ii> a;
vi pos;

int main (void) {
    cin >> n >> k;
    for (int i = 1; i < n+1; ++i) {
        int val;
        cin >> val;
        a.pb(ii(val, i));
    }

    cout << a.size()-1 << " " << k << " " << a.size()-k-1 << "\n";
}

当我尝试测试时:

5 5
1 1 1 1 1

它返回:

4 5 4294967295

但是当我从以下位置更改声明时:

int n, k, sum = 0;

到:

long long n, k, sum = 0;

然后程序返回正确的值,即:

4 5 -1

我无法弄清楚为什么程序会这样,因为 -1 不应超过整数值。谁能给我解释一下?我真的很感激你的帮助。

谢谢

标签: c++c++11

解决方案


vector::size 返回 size_t (无符号),表达式的a.size()-k-1计算结果为无符号类型,因此您最终会出现下溢。


推荐阅读