Merge Changes in Merge Tool
上面的计算在C中给出了错误答案。出了什么问题?
答案 0 :(得分:3)
如果C整数常量适合int
,则其类型为int
。所以你的表达式被评估为:
long int k = (long int)((int)2000*(int)2000*(int)2000);
如果int
不足以保存乘法结果,则会得到有符号整数溢出和未定义的行为。因此,如果long
足够大以保存结果,则应写入:
long k = 2000L * 2000L * 2000L;
L
后缀强制文字的类型为long
(long
相当于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)
您的代码中存在两个问题:
import
(在大多数架构上)不足以存储long int
。8e9
时,使用&#34;简单&#34;进行操作。 2000 * 2000 * 2000
,int
,因此您将结果转换为int * int * int = int
,然后转换为int
。您需要使用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