2013-03-05 178 views
5

我有對整數經營以下冪函數,它工作正常:無符號長long int類型戰俘

int ipow(int base, int exp) 
{ 
    int result = 1; 
    while(exp) 
    { 
     if (exp & 1) 
     { 
      result *= base; 
     } 
     exp >>= 1; 
     base *= base; 
    } 
    return result; 
} 

現在,我想有一個版本,它允許EXP> 32,於是我就用unsigned long類型長整型:

unsigned long long int ipow(int base, int exp) 
{ 
    unsigned long long int result = 1ULL; 
    while(exp) 
    { 
     if (exp & 1) 
     { 
      result *= (unsigned long long int)base; 
     } 
     exp >>= 1; 
     base *= base; 
    } 
    return result; 
} 

但是這第二個版本似乎不工作:

unsigned long long int x; 
x = ipow(2, 35); 
printf("%llu\n", x); 

這將輸出0

我的unsigned long long int實現有什麼問題?

回答

5

您的base變量太小。與其他人一樣,將其更改爲unsigned long long int,因爲它保存的數字大於2^32。 C標準的

+0

確實,非常感謝,現在就工作! – DanielFetchinson 2013-03-05 13:53:13

2

第6.5p4:

一些運營商(一元運算符〜,和二進制運算符< <,>>, &,^和|,統稱爲位運算符)需要 具有整數類型的操作數。這些運算符產生值 ,這些值取決於整數的內部表示,並且具有用於簽名類型的實現定義和未定義方面。 C標準的

第6.5p5:

如果 表達的評價(即,如果該結果不是數學上不範圍限定或 期間發生的異常條件其類型的可表示值),行爲 未定義。

如果在此代碼中使用int之前似乎是個好主意,那麼現在就不應該這樣做。這兩個部分都說你的代碼不像它可能的那樣便攜。

+0

哪部分代碼違反了標準的引用部分? – 2013-03-05 13:35:23

+0

@MichałTrybus嗯,6.5p5是你答案背後的邏輯。 – Sebivor 2013-03-05 13:48:03

+0

哦,當然。我看到:D – 2013-03-05 13:57:37