Это не имеет никакого смысла и является ошибкой.
Я полагаю, что программист не совсем знал, как работают перечисления, и думал, что может заставить перечисления становиться 32-битными, назначая большую целочисленную константуодна из констант перечисления. Это правда, но они выбрали неверное значение, которое не будет работать так, как они думали.
Проблема в том, что при перечислении переменные могут иметь размеры, определенные реализацией, перечисление константы , такие как _BIG_ENUM
, всегда типа int
1) .
Но 0xFFFFFFFF
не уместится в 32-битномint
так что это ошибка. Шестнадцатеричная константа 0xFFFFFFFF
на самом деле имеет тип unsigned int
(при условии, что она 32-битная) и она не подходит, поэтому будет преобразование, определяемое реализацией, из подписанного в неподписанное. Это означает, что в итоге мы получим значение -1
в системах комплемента 2. Хотя gcc и clang со строгими стандартными настройками даже отказываются компилировать код, когда константе перечисления дается целочисленная константа, большая чем INT_MAX
.
Когда она сталкивается с константой перечисления со значением -1
, компиляторсвободно выбирать любой тип со знаком 2) для переменных перечисления этого типа, не обязательно 32-битного.
Код можно исправить, изменив его на _BIG_ENUM=INT_MAX,
(limit.h). Тогда перечислимый тип станет int
или unsigned int
.
1) C17 6.7.2.2/1
Выражение, котороеопределяет значение константы перечисления должно быть выражением целочисленной константы, которое имеет значение, представленное как int
.
2) C16 6.7.2.2/4
Каждый перечисляемый тип должен быть совместим с char
, целочисленным типом со знаком или целочисленным типом без знака. Выбор типа определяется реализацией 128), но должен быть способен представлять значения всех членов перечисления.
128) Реализация может задержать выбор целочисленного типа, пока все константы перечисления не будут иметьбыл замечен.