С++: максимальное целое число

Существует ли кросс-платформенная библиотека С++, которая предоставляет мне переносимое максимальное целое число?

Я хочу объявить:

const int MAX_NUM = /* call some library here */;

Я использую неуправляемый MSVC 2008.

Ответ 1

В заголовке стандартной библиотеки С++ <limits> вы найдете:

std::numeric_limits<int>::max()

Что скажет вам максимальное значение, которое может быть сохранено в переменной типа int. numeric_limits - это шаблон класса, и вы можете передать ему любой из числовых типов, чтобы получить максимальное значение, которое они могут удерживать.

Шаблон класса numeric_limits содержит много другую информацию о числовых типах.

Ответ 2

См. limits.h (C) или climits (С++). В этом случае вам понадобится константа INT_MAX.

Ответ 3

Я знаю, что это старый вопрос, но, возможно, кто-то может использовать это решение:

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 на машине или компиляторе, и не нужно включать дополнительные библиотеки.

Ответ 4

Я знаю, что ответ был дан, но я просто хочу узнать из моих старых дней, я обычно делал

int max = (unsigned int)-1

Будет ли он давать то же самое, что

std::numeric_limits<int>::max()

?

Ответ 5

В 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> :: не переносится.