C++ 64位整数运算:有人可以解释为什么这个有效而另一个没有?

MrH*_*ies 1 c++ 64-bit multiplication

我需要在64位整数上运行.我试图将36的结果提升到12的力量作为练习(并作为一项要求).

我在VS2008编译器上使用了无符号long long来表示64位整数.我已经制作了下面的代码,有人可以向我解释,为什么我的for循环版本会产生不正确的结果,而我的递归版Power函数会产生正确的结果?

仅供参考:36提高到12是4738381338321616896

template< typename _T1, typename _T2 >
_T1 Power( _T1 p_base, _T2 p_power )
{
    /*
    // This produces 0?!!
    if( p_power == 0 ) return 1;
    for( _T2 i = 1; i < p_power; ++i )
    {
        p_base *= p_base;
    }

    return p_base;
    */

    // This produces correct result.
    if( p_power == 0 ) return 1;
    if( p_power == 1 ) return p_base;

    return p_base * Power( p_base, p_power - 1 );
}

void main( int argc, char * argv[] )
{
    unsigned long long charsetSize = 36LL;
    printf( "Maximum Keys: %llu\n\n", Power( charsetSize, 12 ) );

    system( "pause" );
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*hen 5

你在每次迭代时对结果进行平方.它应该是这样的:

_T1 result = 1;
for( _T2 i = 0; i < p_power; ++i )
{
    result *= p_base;
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您像这样编写循环,p_power == 0则不需要检查.