2013-04-06 76 views
0

在循環結果的最後一次迭代中是錯誤的。我知道在減法之前數字可以比long長。這就是爲什麼我把權力設定很久。最後一次迭代的結果應該是17888888888888888889.爲什麼不是?用長整數長計算錯誤

const int NR_LEVELS = 18; 
    unsigned long levels[NR_LEVELS]; 
    unsigned long long power = 10; 
    for(unsigned int i = 0; i < NR_LEVELS; i++) { 
    levels[i] = ((i+1)*10*power-(i+2)*power+1)/9; 
    cout << levels[i] << endl; 
    power *= 10; 
    } 
    levels[17] = 17888888888888888889lu; 
    for(unsigned int i = 0; i < NR_LEVELS; i++) { 
    cout << levels[i] << endl; 
    } 

回答

3

中間值(由9分割前)溢出64位整數。這就是你沒有得到預期結果的原因。

爲了更精確,64位整數的最大值是:

18446744073709551615 

相比分割前的(最小的)中間值:

161000000000000000001 

此答案是假設long鍵入代碼轉換爲64位整數類型(標準要求long類型至少爲32位,因此您可能還會根據環境獲得32位整數類型)。根據操作系統,計算機體系結構和編譯器的不同,long類型的上限可能有所不同。

+0

aaaarrrrr ...我一整天都知道,但不知何故,我認爲long> int並且不能忘記它:C – 2013-04-06 20:34:46

+0

@ lord.didger:代碼中也存在類型問題,但即使使用正確的類型,你將無法獲得正確的結果。 – nhahtdh 2013-04-06 20:37:40