Вопрос

Является enum Тип подписан или без знака? Подписано ли подпись enums отличается в C / C99 / ANSI C / C ++ / C ++ X / GNU C / GNU C99?

Спасибо

Это было полезно?

Решение

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

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

enum SignedEnum { a = -1 };

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

enum ShortEnum : short { a };

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

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

Другие советы

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

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;

Пробовал в ARM GCC - не работает.
Кроме того, Windbg показывает stockname.i как количество, не так V0-V3.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top