首页 > 解决方案 > c ++:int小于INT_MAX时溢出

问题描述

我写了如下代码。

#include <iostream>
#include <string>
#include <stack>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std;

long long int N, K;



int main() {
    cin >> N >> K;

    long long int result = 0;
    int IntResult = 0;

    for (long long int i = K; i <= N + 1; i++) {
        result += 1 + (N + 1 - i) * i;
        IntResult += 1 + (N + 1 - i) * i;
    }

    cout << result % (1000000000 + 7) << endl;
    cout << IntResult % (1000000000 + 7) << endl;
    return 0;
}

当我输入“141421 35623”时,此代码输出如下。

141421 35623
220280457
619089693

正确答案是“220280457”。int 的结果是错误的。

我将 cout 放入 for 循环并检查了 IntResult 的值。

然后我发现 IntResult 在 for 循环中变成了负值。溢出来了!

但为什么?int 的最大值是“2147483648”。它大于“220280457”。

而for循环中的过程只是一个加法,所以我不明白为什么会溢出。

请帮我!

标签: c++integer-overflow

解决方案


您在第一次迭代时溢出。

1 + (N + 1 - i) * i

小于

(N - i)*i

第一次迭代:

(141421-35623)*35623

哎呀已经溢出了,这是有符号整数中的 UB。

IntResult % (1000000000 + 7)

之后发生,并且没有任何意义,因为 IntResult 包含未知值。


推荐阅读