Существует ли кросс-платформенная библиотека С++, которая предоставляет мне переносимое максимальное целое число?
Я хочу объявить:
const int MAX_NUM = /* call some library here */;
Я использую неуправляемый MSVC 2008.
Существует ли кросс-платформенная библиотека С++, которая предоставляет мне переносимое максимальное целое число?
Я хочу объявить:
const int MAX_NUM = /* call some library here */;
Я использую неуправляемый MSVC 2008.
В заголовке стандартной библиотеки С++ <limits>
вы найдете:
std::numeric_limits<int>::max()
Что скажет вам максимальное значение, которое может быть сохранено в переменной типа int
. numeric_limits
- это шаблон класса, и вы можете передать ему любой из числовых типов, чтобы получить максимальное значение, которое они могут удерживать.
Шаблон класса numeric_limits
содержит много другую информацию о числовых типах.
См. limits.h
(C) или climits
(С++). В этом случае вам понадобится константа INT_MAX
.
Я знаю, что это старый вопрос, но, возможно, кто-то может использовать это решение:
int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)
До сих пор мы имеем -1 как результат ', пока размер не будет подписан.
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
Как сказано в стандарте, биты, которые сдвинуты, равны 1, если переменная подписана и отрицательна, а 0, если переменная будет неподписанной или подписанной и положительной.
По мере того, как размер подписан и отрицателен, мы будем сдвигать знаковый бит, который равен 1, что не очень помогает, поэтому мы применяем к unsigned int, вместо этого вынуждаем сдвиг в 0, устанавливая знаковый бит в 0, позволяя всем другим битам остаются 1.
cout << size << endl; // Prints out size which is now set to maximum positive value.
Мы могли бы также использовать маску и xor, но тогда нам нужно было знать точную битрейту переменной. При перемещении в битах фронт нам не нужно знать в любое время, сколько битов int на машине или компиляторе, и не нужно включать дополнительные библиотеки.
Я знаю, что ответ был дан, но я просто хочу узнать из моих старых дней, я обычно делал
int max = (unsigned int)-1
Будет ли он давать то же самое, что
std::numeric_limits<int>::max()
?
В Hp UX с компилятором CC:
#include <iostream>
#include <limits>
using namespace std;
int main () {
if (sizeof(int)==sizeof(long)){
cout<<"sizeof int == sizeof long"<<endl;
} else {
cout<<"sizeof int != sizeof long"<<endl;
}
if (numeric_limits<int>::max()==numeric_limits<long>::max()){
cout<<"INT_MAX == lONG_MAX"<<endl;
} else {
cout<<"INT_MAX != LONG_MAX"<<endl;
}
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
cout << "Maximum value for long: " << numeric_limits<long>::max() << endl;
return 0;
}
Он печатает:
sizeof int == sizeof long
INT_MAX!= LONG_MAX
Я проверил как int, так и длинные типы - 4 байта. Ограничения manpage (5) говорят, что INT_MAX и LONG_MAX являются как 2147483647
http://nixdoc.net/man-pages/HP-UX/man5/limits.5.html
Итак, вывод std:: numeric_limits <type> :: не переносится.