为什么和的价值会出现负值?

时间:2018-04-13 14:50:19

标签: c arrays

我编写了以下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);
}

我不知道为什么会这样?请帮助。

4 个答案:

答案 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 sumsum无法容纳总价值。不确定,但您可以使用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);
}