如何处理C中的溢出

时间:2014-10-09 05:12:52

标签: c overflow

我对编程很陌生,今天我只是在玩编码试图使用函数,我编写了一段简单的代码,解决了我在其中一个类中遇到的数学问题。它基本上取公式(细菌数量)* 2 ^小时计算。

我的问题是,当我得到一个非常大的数字时它没有正确返回,我总是在一定数量的数字后得到-2147483648。我猜测这与溢出有关,但我不能100%确定它是如何工作的。我想弄清楚的是如何在我遇到这种溢出之后得到我正在寻找的实际数字。那么我该怎么做来处理溢出呢?

我最初只是将所有内容设置为int,但经过一些阅读后认为可能会改变所有内容可能会帮助我,但它没有,如果这对我来说是一个可怕的事情,请继续我知道!我使用的测试号码是1500和24,它总是返回上面的数字。

这里有代码谢谢!

#include<stdio.h>
#include<math.h>
long bacteria(long b, long h);

int main(void)
{
        long f,g;

        scanf("%ld%ld",&f,&g);
        f = bacteria(f,g);
        printf("%ld\n",f);

return 0;
}

long bacteria(long b,long h)
{
        long d;
        printf("%ld %ld\n",b,h);
        d = b * (pow(2,h));

return d;
}

3 个答案:

答案 0 :(得分:2)

是的,你怀疑溢出是对的。 C数据类型有一定的范围。您需要使用一些bignum library来处理需要更广范围的情况。另请注意,pow会返回双倍而非long,如您所料。

如果您不关心精确度,可以使用double代替long,而{{1}}的范围更广。

Live example here

答案 1 :(得分:2)

好问题。我在一段时间内遇到同样的问题,使用下面的例子。检查一下,如果这有助于你

http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial

以下链接中的代码。

#include<stdio.h>
int main()
{
    int t;
    int a[200]; //array will have the capacity to store 200 digits.
    int n,i,j,temp,m,x;

    scanf("%d",&t);
    while(t--)
    {
       scanf("%d",&n);
       a[0]=1;  //initializes array with only 1 digit, the digit 1.
       m=1;    // initializes digit counter

       temp = 0; //Initializes carry variable to 0.
       for(i=1;i<=n;i++)
       {
            for(j=0;j<m;j++)
            {
               x = a[j]*i+temp; //x contains the digit by digit product
               a[j]=x%10; //Contains the digit to store in position j
               temp = x/10; //Contains the carry value that will be stored on later indexes
            }
             while(temp>0) //while loop that will store the carry value on array.
             { 
               a[m]=temp%10;
               temp = temp/10;
               m++; // increments digit counter
             }
      }
              for(i=m-1;i>=0;i--) //printing answer
              printf("%d",a[i]);
              printf("\n");
    }
    return 0;
}

答案 2 :(得分:1)

使用longlong数据类型而不是simple long来包含更大的值。