用于长数计算的C中的错误答案

时间:2015-12-15 12:31:22

标签: c long-integer

Merge Changes in Merge Tool

上面的计算在C中给出了错误答案。出了什么问题?

5 个答案:

答案 0 :(得分:3)

如果C整数常量适合int,则其类型为int。所以你的表达式被评估为:

long int k = (long int)((int)2000*(int)2000*(int)2000);

如果int不足以保存乘法结果,则会得到有符号整数溢出和未定义的行为。因此,如果long足够大以保存结果,则应写入:

long k = 2000L * 2000L * 2000L;

L后缀强制文字的类型为longlong相当于long int)。

但是在大​​多数平台上,即使long只是一个32位类型,所以你必须使用保证至少有64位的long long

long long k = 2000LL * 2000LL * 2000LL;

LL后缀强制文字的类型为long long

答案 1 :(得分:2)

2000的类型为int,因此2000*2000*2000的类型为int

假设32位int(实际上超过标准要求,因为标准不要求int表示超过32767的值)可表示的值约为2,147,483,647(为便于阅读而插入逗号),该值小于8,000,000,000

您可能希望以2000LL*2000*2000进行计算,利用乘法左右关联,并在执行乘法之前将所有2000值提升为long long int。如果您希望保证能够存储结果,则您的变量也必须是long long int类型。

答案 2 :(得分:1)

Holt的answer是正确的,我只是把它留在这里作为警告

可以尝试使用:

long long int

而不是

long int

但是,在我的本地计算机中,它没有任何效果:

#include <stdio.h>

int main(void)
{

    long int k=(long int)(2000*2000*2000);
    printf("With long int, I am getting: %ld\n", k);

    long long int n = 2000*2000*2000;
    printf("With long long int, I am getting: %lld\n", n);

    return 0;
}

输出:

With long int, I am getting: -589934592
With long long int, I am getting: -589934592

警告:

../main.c:6:36: warning: integer overflow in expression [-Woverflow]
     long int k=(long int)(2000*2000*2000);
                                    ^
../main.c:9:32: warning: integer overflow in expression [-Woverflow]
     long long int n = 2000*2000*2000;

即便如此:

unsigned long long int n = 2000*2000*2000;
printf("With long long int, I am getting: %llu\n", n);

也会溢出。

答案 3 :(得分:1)

您的代码中存在两个问题:

  1. import(在大多数架构上)不足以存储long int
  2. 执行8e9时,使用&#34;简单&#34;进行操作。 2000 * 2000 * 2000int,因此您将结果转换为int * int * int = int,然后转换为int
  3. 您需要使用long int并指定您想要long long int

    long long int

    请注意long long int k = 2000LL*2000LL*2000LL; 之后的额外LL&#34;它是2000,但是2000!&#34;。

答案 4 :(得分:0)

您不能将这些值乘以普通精度整数,然后将结果转换为更高的精度,因为结果已经溢出。相反,操作数在它们相乘之前需要是更高精度的整数。请尝试以下方法:

#include <stdio.h>

int main(void)
{
    long long int n = (long long int)2000*(long long int)2000*(long long int)2000;
    printf("long long int operands: %lld\n", n);

    return 0;
}

在我的机器上,这给出了:

long long int operands: 8000000000