C ++ 64-битная целочисленная операция: может кто-то объяснить, почему это работает, а другой нет? - PullRequest
1 голос
/ 11 ноября 2010

Мне нужно работать с 64-битными целыми числами.Я пытаюсь получить результат 36, возведенный в степень 12 как упражнение (и как требование).

Я использовал unsigned long long для 64-битного целого числа на моем компиляторе VS2008.Я сделал приведенный ниже код, и кто-то может мне объяснить, почему моя версия цикла 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" );
}

Ответы [ 3 ]

5 голосов
/ 11 ноября 2010

Вы возводите в квадрат результат на каждой итерации. Это должно быть что-то вроде:

_T1 result = 1;
for( _T2 i = 0; i < p_power; ++i )
{
    result *= p_base;
}

Обратите внимание, что если вы пишете цикл таким образом, проверка p_power == 0 не требуется.

1 голос
/ 11 ноября 2010

p_base *= p_base;

Это неверно. Результат возводится в квадрат после каждой итерации

Исправление

_T1 pow = 1LL;
for( _T2 i = 1; i <= p_power; ++i )
{
    pow *= p_base;
}
return pow;
1 голос
/ 11 ноября 2010

Это потому, что вы сохраняете результат каждого умножения в p_base. Это, вероятно, вызывает переполнение переменной.

Вам необходимо хранить входное значение для p_base и «рабочей» переменной отдельно. По логике цикла for 2 в степень 4 равно 65536.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...