Является ли enum типом подписанным или неподписанным? Является ли значение переписей отличным от C/C99/ANSI C/С++/С++ x/GNU C/GNU C99?
Спасибо
Ответ 1
Гарантируется, что перечисление будет представлено целым числом, но фактический тип (и его подпись) зависит от реализации.
Вы можете заставить перечисление быть представленным подшитым типом, указав один из счетчиков отрицательное значение:
enum SignedEnum { a = -1 };
В С++ 0x может быть явно указан базовый тип перечисления:
enum ShortEnum : short { a };
(С++ 0x также добавляет поддержку индексированных областей)
Для полноты я добавлю, что в языке программирования C, 2nd ed., перечисления указаны как имеющие тип int (стр. 215). K & R не является стандартом C, поэтому он не является нормативным для компиляторов ISO C, но он предшествует стандарту ISO C, поэтому он по крайней мере интересен с исторической точки зрения.
Ответ 2
Это старый вопрос... но я только что узнал об этом:
typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;
Вы можете использовать его как 2-битный беззнаковый индекс, например:
typedef struct {
ENUMNAME i:2;
} STRUCTNAME;
Пробовал в GCC ARM - не работает.
Кроме того, WinDbg показывает STRUCTNAME.i как число, а не как v0-v3.