Подпись перечисления в C / C99 / C ++ / C ++ x / GNU C / GNU C99 - PullRequest
31 голосов
/ 05 апреля 2010

Тип enum подписан или не подписан? Различается ли подпись перечислений в C / C99 / ANSI C / C ++ / C ++ x / GNU C / GNU C99?

Спасибо

Ответы [ 2 ]

27 голосов
/ 05 апреля 2010

Перечисление гарантированно представляется целым числом, но фактический тип (и его подпись) зависит от реализации.

Вы можете принудительно представить перечисление подписанным типом, задав одному из перечислителей отрицательное значение:

enum SignedEnum { a = -1 };

В C ++ 0x базовый тип перечисления может быть указан явно:

enum ShortEnum : short { a };

(в C ++ 0x также добавлена ​​поддержка перечислений по областям)

Для полноты картины добавлю, что в языке программирования C, 2-е изд. перечислители определены как имеющие тип int (стр. 215). K & R не является стандартом C, поэтому он не является нормативным для компиляторов ISO C, но он предшествует стандарту ISO C, так что по крайней мере это интересно с исторической точки зрения.

0 голосов
/ 15 июня 2016

Это старый вопрос ... но я только что узнал:

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.

...