Во-первых, нет гарантии, что INT_MAX
- это 2147483647. Во-вторых, нет гарантии, что у вашего перечисления будет базовый тип, способный хранить 2147483647 или хранить любое значение INT_MAX
.
Теперь, если вы хотите знать, можете ли вы использовать значения, для которых не определен перечислитель, тогда ответ «да». Вы можете использовать значения без соответствующего перечислителя, если значение соответствует диапазону перечисления. Максимальное значение в этом диапазоне - наименьшее 2 ^ n - 1, которое больше или равно всем перечислителям. В вашем случае диапазон составляет [0,1], поэтому никакие другие значения не могут быть использованы четко определенным образом.
В следующем коде диапазон перечисления равен [0,3], поэтому 3
является допустимым значением, даже если для него нет перечислителя.
#include <iostream>
enum e {zero,one,two};
void main()
{
e num=(e)3;
std::cout<<num; // will print "3"
}
Наименьшее значение в диапазоне равно 0, если нет перечислителей с отрицательными значениями. Если есть перечислители с отрицательными значениями, это зависит от представления, используемого реализацией. Если реализация использует дополнение до двух, это - (max + 1), в противном случае это просто -max. В основном, если есть отрицательные значения, диапазон имеет еще один бит:)
#include <iostream>
enum e {minus_one=-1,zero,one,two};
void main()
{
e num=(e)-3;
std::cout<<num; // will print "-3"
}
А в C ++ 11 вы можете явно указать базовый тип, если хотите убедиться, что значение будет представимым:
#include <iostream>
#include <cstdint>
enum e : std::int32_t {zero,one};
void main()
{
e num=(e)2147483647;
std::cout<<num; // will print "2147483647"
}