2016-05-18 46 views
-1
long long n, prod, i; 
n = 13; 
prod = 1; 

for (i = 1 ; i <= n ; i++) { 
    prod *= i; 
} 
printf("%d\n", prod); 
printf("%d\n", sizeof(long long)); 

返回的sizeof(長長)給出8但數字溢出在2 ** 32

$ 1932053504 
$ 8 

結果顯然溢出。但我不明白爲什麼這是發生在long longsizeof(int)返回4 [字節],但產品相同。我究竟做錯了什麼?

+0

爲什麼結果溢出? –

+0

因爲使用python:'math.factorial(13)-2 ** 32 == 1932053504' – Nimitz14

+0

請閱讀我的答案。 –

回答

6

您必須使用正確的說明符。 "%d"說明符預計爲int,並且您通過了long long int。根據標準,這將調用未定義的行爲。觀察到的行爲可能是可以解釋的,但這並不意味着它不是嚴格的未定義的行爲

修復此類

printf("%lld\n", prod); 
printf("%zu\n", sizeof(long long)); 

的代碼,如預期它應該工作。

注意:啓用編譯警告,你應該很快找出這種錯誤。

+0

啊,好的,謝謝。但是,你能解釋爲什麼你在解決方案中使用兩個不同的說明符? – Nimitz14

+0

因爲'sizeof'會給出一個'size_t',它需要''%zu「'說明符。這不是一個很長的整數。由於沒有其他方法可以保證類型安全,因此您必須對說明符和傳入的類型非常嚴格。 –

+0

有道理。謝謝 ! – Nimitz14

2

結果明顯溢出。

這是一個錯誤的結論。你正在得到一個截斷的結果。

當我運行:

#include <stdio.h> 

int main() 
{ 
    long long n, prod, i; 
    n = 13; 
    prod = 1; 

    for (i = 1 ; i <= n ; i++) { 
     prod *= i; 
    } 
    int truncated_value = prod; 

    printf("%d\n", prod); 
    printf("%d\n", truncated_value); 
} 

我得到

1932053504 
1932053504 

截斷髮生由於使用%d格式說明的。

您可以通過使用正確的格式說明符來解決該問題。

printf("%lld\n", prod);