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节:
如果在计算表达式期间发生exception情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。
如果以前在这段代码中使用int
似乎是个好主意,现在就不应该了。 这两个部分都说你的代码不是那么便携。