Я хотів би знати максимальне значення size_t в системі, в якій працює моя програма. Моїм першим інстинктом було використовувати мінус 1, ось так:
size_t max_size = (size_t)-1;
Але я здогадуюсь, що є кращий спосіб, або десь визначена константа.
Я хотів би знати максимальне значення size_t в системі, в якій працює моя програма. Моїм першим інстинктом було використовувати мінус 1, ось так:
size_t max_size = (size_t)-1;
Але я здогадуюсь, що є кращий спосіб, або десь визначена константа.
size_t
змінної типу. Наприклад, std::string::npos
встановлено значення (size_t)-1
(принаймні у реалізації MSVC).
size_t max_size = (size_t)-1;
насправді робить і як? Дякую.
size_t
є типом без підпису відповідно до стандарту. Так скажімо, це визначається як 32-бітове значення. -1 представляється як 0xffffffff для підписаного значення з використанням доповнення двох. Однак, якщо ми перекинемо це на size_t, який є непідписаним типом, натомість це максимальне значення. (size_t)(-1)
те саме, що і (size_t)(0xffffffff)
в 32-розрядної системі. Краще використовувати -1, оскільки це спрацює, якщо він 16-розрядний (0xffff) або 64-розрядний.
Відповіді:
Константа маніфесту (макрос) існує в C99 і вона викликається SIZE_MAX
. У C89 / 90 такої константи немає.
Однак те, що ви маєте у своєму початковому дописі, - це цілком портативний метод пошуку максимального значення size_t
. Гарантована робота з будь-яким типом без підпису.
-1 mod (<max-value> + 1)
, що завжди справедливо <max-value>
.
-1
можна представити як int
. §6.3.1.3 гарантує, що він перетворюється на дійсне size_t
значення.
size_t
це тип без підпису, тому всі значення є дійсними. Це не може бути поданням пастки, оскільки такої пастки немає.
6.2.6.2 Integer types
": If there are N value bits, each bit shall represent a different power of 2 between 1 and 2^N−1..
Отже, для цілочисельних типів без підпису насправді не існує сюрпризів.
Як альтернативу бітовим операціям, запропонованим в інших відповідях, ви можете зробити це в C ++
#include <limits>
size_t maxvalue = std::numeric_limits<size_t>::max()
std::numeric_limits<size_t>::max()
не є constexpr
, і це не оптимізовано добре деякими компіляторами, як Clang. GCC, ICC та MSC добре справляються з цим. Його часто краще дотримуватися #define
.
constexpr
версія max()
доступною: en.cppreference.com/w/cpp/types/numeric_limits/max
size_t max_size = (size_t)-1;
Рішення , запропоноване в ОП, безумовно, кращий до сих пір, але я зробив фігуру з інших, більш заплутаних, способу зробити це. Я публікую це просто для академічної цікавості.
#include <limits.h>
size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1;
Якщо ви припускаєте принаймні компілятор C ++ 11, тоді SIZE_MAX повинен бути вам доступний: