2015-12-15 67 views

回答

1

霍尔特的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); 

会溢出了。

1

有在你的代码的两个问题:

  1. long int是(在大多数架构)没有足够的存储8e9
  2. 当你这样做2000 * 2000 * 2000,操作使用由“简单” int,因此,int * int * int = int所以你把结果给int,然后到long int

您需要使用long long int,并指定要long long int

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

通知2000后的额外LL说: “这是2000年,但作为一个long long int!”。

+0

正确!,你的答案如果好得多,但我会把我当作洞穴食物。 – gsamaras

+0

如今,在大多数平台上long int是64位的,所以存储这个数字就足够了。 – Ctx

+1

@ M.M你说得对,我不知道我从哪里得到这个想法...... – Holt

2

2000int类型,所以2000*2000*2000也是int类型。

假设32位int(这是比标准需要实际上更大,因为一个int不需要由标准来表示的值超过32767)的最大可表示值约为2,147,483,647(插入可读性逗号)这小于8,000,000,000

你可能会想要做的测算为2000LL*2000*2000其利用乘法被左右关联,做乘法之前,将促进所有2000long long int。如果您希望保证能够存储结果,您的变量也需要是long long int类型。

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位的,所以你必须使用long long这是保证至少有64位:

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

LL后缀力的类型字面值为long long

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