[英]unsigned long long int pow
我有以下冪函數,它對整數運算,它工作正常:
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 long int:
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實現有什么問題?
您的base
變量太小。 將其更改為unsigned long long int
,與其他unsigned long long int
一樣,因為它包含的數字大於2^32
。
C標准第6.5p4節:
一些運算符(一元運算符〜,以及二元運算符<<,>>,&,^和|,統稱為按位運算符)需要具有整數類型的操作數。 這些運算符產生的值取決於整數的內部表示,並且具有已簽名類型的實現定義和未定義方面。
C標准第6.5p5節:
如果在計算表達式期間發生異常情況(即,如果結果未在數學上定義或未在其類型的可表示值范圍內),則行為未定義。
如果以前在這段代碼中使用int
似乎是個好主意,現在就不應該了。 這兩節都說你的代碼不是那么便攜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.