我编写了以下c代码来查找给定数组的前49个数字的总和,但总和是负数。
#include<stdio.h>
int main()
{
int i;
long int sum=0;
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, 278722863, 233665124, 2145174068, 468703136, 1101513930, 1801979803, 1315634023, 635723059, 1369133070, 1125898168, 1059961394, 2089018457, 628175012, 1656478043, 1131176230, 1653377374, 859484422, 1914544920, 608413785, 756898538, 1734575199, 1973594325, 149798316, 2038664371, 1129566414};
for(i=0;i<49;i++)
{
sum=sum+a[i];
printf("sum is : %ld\n",sum);
}
printf("\nthe total sum is %ld",sum);
}
我不知道为什么会这样?请帮助。
答案 0 :(得分:4)
我实际上并没有添加它们,但只是看着它们,我说它是一个非常安全的猜测,你遇到了整数溢出错误。
long int
的最大大小约为20亿(2 ^ 31)。如果你添加更多,它会回顾并转到-2 ^ 31。
如果要总结这些数字,您需要使用能够容纳更多数据类型的数据类型。可能long long int
应该有效。如果你确定它总是积极的,那么使用unsigned long long int
会更好。
答案 1 :(得分:4)
使用long long
代替long
,该程序有效:
输出:56074206897
<强>原因强>
长度范围:-2 ^ 31 + 1到+ 2 ^ 31-1
长长的范围:-2 ^ 63 + 1到+ 2 ^ 63-1
如你所见2 ^ 31-1 = 2147483647&lt;
56074206897;
但是2 ^ 63-1 = 9,223,372,036,854,775,807> 56074206897
这会导致溢出。根据C标准,有符号整数溢出的结果是未定义的行为。这意味着如果这种情况在运行时发生,编译器就可以让你的代码做任何事情。您的程序可能会崩溃,或者产生错误的答案,或者对代码的其他部分产生不可预测的影响,或者它可能默默地执行您的预期。
在您的情况下,它超出了系统上long int
的最大值。由于long int
已签名,因此当最高有效位设置时,它将变为负数。
答案 2 :(得分:2)
正如来自莫斯科的弗拉德所说,这是一个溢出问题,导致了一种不确定的行为。在您的系统中(long int sum
)sum
无法容纳总价值。不确定,但您可以使用long long int sum =0;
(在C99之后)。如果它仍然无法正常工作,请搜索&#34; BigInteger&#34;实施
答案 3 :(得分:2)
由于long int的最大范围高达2,147,483,647,并且sum的值大于范围。因此,它将作为负值。您可以使用以下代码...
#include<stdio.h>
int main()
{
int i;
long long int sum=0; //Taking long long int instead of long int
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, 278722863, 233665124, 2145174068, 468703136,
1101513930, 1801979803, 1315634023, 635723059, 1369133070, 1125898168,
1059961394, 2089018457, 628175012, 1656478043, 1131176230, 1653377374,
859484422, 1914544920, 608413785, 756898538, 1734575199, 1973594325,
149798316, 2038664371, 1129566414};
for(i=0;i<49;i++)
{
sum=sum+a[i];
printf("sum is : %lld\n",sum);
}
printf("\nTotal sum is %lld",sum);
}