Почему эта функция не превышает значение 2 ^ 31? - PullRequest
2 голосов
/ 02 января 2012

Степенная функция (написана на с ++) ...

long power (long a, long b){
    long result=1l;
    for (int i = 0;i<b;i++){
        result*=a;
    }
    return result;
}

Теперь я провожу тестирование выходных данных ...

cout<<power(2l,2l)<<endl;
cout<<power(2l,4l)<<endl;
cout<<power(2l,31l)<<endl;
cout<<power(2l,32l)<<endl;
cout<<power(2l,61l)<<endl;

Выход:

4
16
-2147483648
0
0

Что ж, похоже, есть некоторая проблема с длинным отступлением до 32-битного размера (вместо того, чтобы оставаться как 64-битный). Мне интересно, почему это не работает, но если я использую тип long long, все работает нормально.

Дополнительная информация:

Я использую C ++ и компилятор MinGW
Я использую 64-битную ОС (Windows 7)

UPDATE:

Вы, ребята, потрясающие! Никогда не думал, что это будет происходить.

Я только что проверил некоторые произвольные PDT, используя sizeof, и это то, что я нашел ...

cout<<sizeof(long)<<" "<<sizeof(int)<<" "<<sizeof(char)<<" "<<sizeof(long long)<<" "<<sizeof(uint64_t)<<endl;

Выход:

4 4 1 8 8

Итак, похоже, что мои long и int имеют размер 32 бита. Еще немного игры показывает, что тип intmax_t также 64-битный. Практически каждый PDT ограничен 64 битами, поэтому, если мне когда-нибудь понадобится представить 128-битное целое число, есть ли в c ++ встроенный класс для этого (что-то похожее на BigInteger в Java)?

Ответы [ 4 ]

6 голосов
/ 02 января 2012

Видимо, тип long в вашей среде равен 32 битам.

Чтобы обойти подобные проблемы, я бы предложил использовать такие типы, как uint64_t, вместо того чтобы полагаться на предположение, что нативный типимеет определенный размер.

РЕДАКТИРОВАТЬ

Чтобы ответить на ваш второй вопрос (есть ли в c ++ встроенный класс для 128-битных целых чисел?): Нет, это не так,Или, скорее, он не обязывает один.Однако, если реализация предоставит ее, вы сможете использовать что-то вроде uint128_t.Лично я не видел ни одной системы, которая бы это делала.Однако есть сторонние библиотеки, такие как GMP , которые предоставляют эту функциональность.

1 голос
/ 02 января 2012

A.попробуйте запустить:

cout<<sizeof(long);

Чтобы увидеть, что это 32-битный.

B.Я думаю, что это проблема с определением вашего проекта.даже если вы работаете на 64-битной машине, она может скомпилировать 32-битную программу, чтобы вы могли использовать ее как на 32, так и на 64-х машинах, но на машинах.
, а long всегда размером с указатель ...

C.uint64_t - лучшая практика.

0 голосов
/ 02 января 2012

Тип long long занимает 32 бита, поэтому максимальное положительное значение равно 4294967296-1. Но ваша функция вычисляет значение 5842587018385982521381124421 = 21 ^ 21.

0 голосов
/ 02 января 2012

В C ++, как и в C, размер int зависит от архитектуры, и это все верно, но подвох состоит в том, что 32-битные int со знаком идут между -2 ^ 31 и (2 ^ 31-1), не 2 ^ 31. Вы действительно переполняете 32-битное число. Вы должны использовать unsigned int вместо этого. Это между 0 и (2 ^ 32-1).

...