为什么在乘法中使用long int会产生一个奇怪的数字?

时间:2014-03-02 08:28:39

标签: c

编译此代码后:

#include <stdio.h>

int main()
{

    long int a = 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
    printf("%i\n", a);

    return 0;
}

结果我得到-1486618624。如何使此代码有效?

提前感谢您的任何答案!

3 个答案:

答案 0 :(得分:2)

您指定的1000的实例为int s,因此乘法是通过乘以int并获得int来实现的。在将其分配给long int之前,它会溢出。尝试:

long int a = 1000L * 1000L * 1000L * 1000L * 1000L * 1000L;

此外,您还需要使用long int格式打印答案,例如:

printf("%ld\n", a);

注意long int也可能太小(如果你在某些32位平台上,long int中的最大存储空间是2^31 - 1,而在64位平台上它是{{1}这就足够了,在这种情况下尝试:

2^63 - 1

答案 1 :(得分:2)

即使您要分配给long int,您的每个1000都是int,因此计算机会尝试将结果计算为int。超过最大int大小的数字会溢出,导致它绕过&#34;环绕&#34;并被视为负面因素,因为用于int的一部分内存是负面标记。

您需要使用10001000L投射(long int) 1000 s。您的%ld中还需要%i而不是printf

答案 2 :(得分:1)

尝试使用

long long var=1000LL*1000LL*1000LL;  // append LL

printf("%lld",var);