为什么我无法以长数据类型存储数据?

Cha*_*ana 13 c types long-integer

int power(int first,int second) {
    int counter1 = 0;
    long ret = 1;

    while (counter1 != second){
        ret *= first;
        counter1 += 1;
    }
    return ret;
}


int main(int argc,char **argv) {

    long one = atol(argv[1]);
    long two = atol(argv[2]);
    char word[30];
    long finally;

    printf("What is the operation? 'power','factorial' or 'recfactorial'\n");
    scanf("%20s",word);

    if (strcmp("power",word) == 0){
        finally = power(one,two);
        printf("%ld\n",finally);
        return 0;
    } 

}
Run Code Online (Sandbox Code Playgroud)

这个函数用于执行像计算器一样的"power of power"操作,所以如果我写:./a.out 5 3它将给我5的3的幂并打印出125

问题是,如果数字如下:./a.out 20 10,20到10的幂,我希望看到结果:1.024 x 10^13,但它反而输出797966336.

我得到的当前输出的原因是什么?

注意:我认为这atol()long数据类型有关.这些不足以存储信息吗?如果没有,任何想法如何让它运行更大的数字?

Lig*_*ica 23

当然,你的输入是long,但你的power功能需要并返回int!显然,这是你系统上的32位...所以,在你的系统上,1.024×10 13int可以处理的.

确保选择一个足够大的数据类型,并始终如一地使用它.甚至long可能还不够 - 检查你的系统!

  • 请注意,Windows`long`也是32位.您可能希望使用"long long"或浮点类型来处理与示例一样大的数字.这是一个[MSDN页面](https://msdn.microsoft.com/en-us/library/s3f49ktz.aspx),其中包含更多信息 (2认同)

Sou*_*osh 9

首先,您需要更改的返回类型和输入参数类型power(),从intlong.否则,在一个系统上long,并int都具有不同的尺寸,

  1. int在您传递时,输入参数可能会被截断long.

  2. 返回值将返回int之前返回值,这可能会截断实际值.

之后,1.024×10 13(10240000000000)不能被intlong(如果是32位)保持.您需要使用具有更多宽度的数据类型,例如long long.