Ваш код недействителен:
C90 (6.5.2.2, Спецификаторы перечисления):
Ограничения
Выражение, котороеопределяет значение константы перечисления должно быть выражением целочисленной константы, которое имеет значение, представляемое как int
.
C99 (и без изменений в черновике C11) (6.7.2.2, Спецификаторы перечисления):
Ограничения
Выражение, которое определяет значение константы перечисления, должно быть выражением целочисленной константы, значение которого может быть представлено как int
.
Ваши значения превышают диапазон 32-bit int
, так что это ошибка (и требуется диагностика).
Обратите внимание, что это строго относится к "инициализаторам" констант перечисления.Например, если у нас есть
enum foo { BAR = 42u };
, то это ограничение говорит, что значение 42u
должно быть в состоянии вписаться в int
(что он делает; это просто без знака 42, а 42 помещается вint
).
Сам тип BAR
равен int
(как ни удивительно, но не enum foo
).
Но если вы объявите переменную типа enum foo
,тогда его размер и подпись определяются реализацией.Он будет основан на некотором существующем целочисленном типе (который может хранить все значения перечисления), но какой тип фактически используется, может отличаться в разных реализациях (а также между различными enum
типами).