Подтвердить что ты не робот

Что такое С++-эквивалент UINT32_MAX?

В C99 я включаю stdint.h, и это дает мне UINT32_MAX, а также uint32_t. Однако в С++ определяется UINT32_MAX. Я могу определить __STDC_LIMIT_MACROS перед включением stdint.h, но это не работает, если кто-то включает мой заголовок после того, как он уже включает stdint.h.

Итак, в С++, какой стандартный способ определения максимального значения представлен в uint32_t?

4b9b3361

Ответ 1

Ну, я не знаю о uint32_t, но для основных типов (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) вы должны использовать шаблоны numeric_limits через #include <limits>.

cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;

Если uint32_t является #define одного из указанных выше, этот код должен работать из коробки

    cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;

Ответ 2

Ну, uint32_t всегда будет 32 бит и всегда будет неподписанным, поэтому вы можете безопасно определить его вручную:

#define UINT32_MAX  (0xffffffff)

Вы также можете сделать

#define UINT32_MAX  ((uint32_t)-1)

Ответ 3

std::numeric_limits<T>::max() определяет максимальное значение для типа T.

Ответ 4

Вы можете устранить проблемы порядка #include, изменив процесс сборки, чтобы определить символ __STDC_LIMIT_MACROS в командной строке компилятора:

cxx -D__STDC_LIMIT_MACROS ...

Конечно, у вас все еще будет проблема, если заголовок #undef этот символ.

Кроме того, авторы стандартной реализации библиотеки, которые вы используете, могут не предназначаться для пользователей, чтобы установить этот конкретный символ; может существовать флаг компилятора или другой символ, который пользователи должны использовать для включения типов C99 в С++.

Ответ 5

Я не могу прокомментировать, так вот мой вклад в ответ Глен против Лиора Когана.

Если вы используете статические переменные, вы столкнетесь с проблемой, что если вы присвоите константное значение внутри класса numeric_limits:: max(), это значение будет фактически установлено равным нулю из-за порядка инициализации (см. post нулевая инициализация и статическая инициализация статической переменной локальной области)

Итак, в этом случае он будет работать только с помощью ответа Лиора Когана.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX  ((uint32_t)-1)