36

类型是有enum符号还是无符号?枚举的符号是否在以下之间有所不同:C/C99/ANSI C/C++/C++x/GNU C/GNU C99?

谢谢

4

2 回答 2

28

枚举保证由整数表示,但实际类型(及其符号)取决于实现。

您可以通过为枚举数之一赋予负值来强制枚举由有符号类型表示:

enum SignedEnum { a = -1 };

在 C++0x 中,可以显式指定枚举的底层类型:

enum ShortEnum : short { a };

(C++0x 还增加了对作用域枚举的支持)

为了完整起见,我将在The C Programming Language, 2nd ed 中添加它。,枚举数被指定为具有类型int(第 215 页)。K&R 不是 C 标准,因此这不是 ISO C 编译器的规范,但它确实早于 ISO C 标准,因此从历史的角度来看它至少是有趣的。

于 2010-04-05T15:38:09.587 回答
0

这是一个老问题......但我刚刚发现:

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。

于 2016-06-15T14:25:18.317 回答