2015-12-15 44 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