Функция питания (написана в C++) ...Почему эта функция не превышает значение 2^31?
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:
Вы, ребята, здорово! Никогда не думал, что это будет происходить.
Я только что проверил некоторые произвольные ТПР с помощью 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)?
Dont guess - напечатайте значения sizeof (long) и sizeof (int), чтобы узнать, насколько они велики –
Если вы хотите задать новый вопрос, я бы рекомендовал создать новый вопрос (или, еще лучше, [ поиск предыдущего вопроса по теме] (http://stackoverflow.com/search?q= [c% 2B% 2B] + большая + целочисленная + библиотека)). Вот одна быстрая ссылка: http://gmplib.org/ –