(C++)Visual Studio对于简单的数组求和问题给出了与其他编译器不同的输出

jdg4fx2g  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(181)

验证码:

#include <iostream>

using namespace std;

long ar[10];
int arraySize;

long aVeryBigSum(long arr[]) {
    long total = 0;

    for (int x = 0; x < arraySize; x++) {
    
        total += ar[x];
    }
    return total;
}

int main() {
    
    cin >> arraySize;
    for (int x = 0; x < arraySize; x++) {

        cin >> ar[x];   
    }
    cout << aVeryBigSum(ar);

return 0;
}

输入:

5
1000000001 1000000002 1000000003 1000000004 1000000005

Visual Studio输出:

705032719

在线IED输出(正确):

5000000015

我不知道在这种情况下该怎么做,因为不同的编译器给了我不同的答案

b4lqfgs4

b4lqfgs41#

您的long int可能是一个有符号的32位整数类型,这意味着它可以存储的最大正整数是2,147,483,647,但您的总和为5,000,000,015。因为这个值更大,所以发生了整数溢出。
long int类型替换为long long int。或者,为了使类型的大小更明确,可以包含<cstdint>并使用int64_t

wdebmtf2

wdebmtf22#

而“长”的极限为-2,147,483,648 ~ 2,147,483,647;你可以使用std::numeric_limits<long>::max();来得到极限.值total已经超过了它的极限,因为第三次加法,所以结果不是你的期望.改变长到“长长”你会得到正确的答案.

long long aVeryBigSum(long arr[]) {
long long total = 0;

for (int x = 0; x < arraySize; x++) {

    total += ar[x];
}
return total;

}
至于其他IDE,也许他们做了一些优化?

pbossiut

pbossiut3#

这个问题与特定的编译器和机器有关,C++标准只是承诺int的长度不小于short,long的长度不小于int,long的长度不小于long。

相关问题