为何计算数组前49项和时结果为负数?C代码问题咨询
问题分析与解决方案
你遇到的负数结果问题,本质是32位整数溢出导致的,我来给你拆解清楚:
为什么会出现负数?
在绝大多数现代系统中,long int是32位的有符号整数,它的取值范围是 -2147483648 到 2147483647(也就是约-21亿到21亿)。看你数组里的元素,很多都接近20亿,49个这样的数累加起来,总和会远远超过32位long int能容纳的最大值。当有符号整数溢出时,会触发未定义行为,但在大多数编译器里会按照“模2补码”的方式绕回——也就是超过最大值后,数值会跳到负数区间,这就是你得到负数结果的原因。
另外,我注意到你的代码里还缺少了累加的循环逻辑,这应该是你遗漏的部分,不过核心问题还是数据类型的溢出。
修复方案
改用64位的整数类型long long int,它的取值范围是 -9223372036854775808 到 9223372036854775807(约-9e18到9e18),完全能容纳这些元素的总和。
修正后的代码如下:
#include<stdio.h> int main() { int i; // 改用long long int存储总和和数组元素 long long int sum = 0; long long int a[50] = {846930887,1681692778,1714636916, 1957747794, 424238336, 719885387, 1649760493, 596516650, 1189641422, 1025202363, 1350490028, 783368691, 1102520060, 2044897764, 1967513927, 1365180541, 1540383427, 304089173, 1303455737, 35005212, 521595369, 294702568, 1726956430, 336465783, 861021531, 278722...}; // 补全你剩下的元素 // 循环累加前49个元素 for(i = 0; i < 49; i++){ sum += a[i]; } printf("前49个元素的和为:%lld\n", sum); return 0; }
额外提示
- 如果你不确定当前系统中
long int的位数,可以用sizeof(long int)来查看,比如在32位系统中是4字节(32位),64位系统中可能是8字节,但为了跨平台的兼容性,直接用long long int更稳妥。 - 你给出的数组元素都在32位int范围内,改成
long long int后不会有元素溢出的问题。
内容的提问来源于stack exchange,提问作者Coderandhacker
相关产品推荐
相关产品推荐

