整数で動作する次の累乗関数があり、正常に動作します。
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;
}
しかし、この 2 番目のバージョンは機能していないようです。
unsigned long long int x;
x = ipow( 2, 35 );
printf( "%llu\n", x );
これは 0 を出力します。
unsigned long long int 実装の問題は何ですか?