验证码:
#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
我不知道在这种情况下该怎么做,因为不同的编译器给了我不同的答案
3条答案
按热度按时间b4lqfgs41#
您的
long int
可能是一个有符号的32位整数类型,这意味着它可以存储的最大正整数是2,147,483,647,但您的总和为5,000,000,015。因为这个值更大,所以发生了整数溢出。将
long int
类型替换为long long int
。或者,为了使类型的大小更明确,可以包含<cstdint>
并使用int64_t
。wdebmtf22#
而“长”的极限为-2,147,483,648 ~ 2,147,483,647;你可以使用
std::numeric_limits<long>::max();
来得到极限.值total已经超过了它的极限,因为第三次加法,所以结果不是你的期望.改变长到“长长”你会得到正确的答案.}
至于其他IDE,也许他们做了一些优化?
pbossiut3#
这个问题与特定的编译器和机器有关,C++标准只是承诺int的长度不小于short,long的长度不小于int,long的长度不小于long。