枚举可以容纳大于INT_MAX的无符号整数吗?

时间:2018-12-08 11:11:57

标签: c enums unsigned-integer

enum Some_Flag {
        SOME_FLAG_A = 0x00000000u,
        SOME_FLAG_B = 0x00000001u,
        SOME_FLAG_C = 0x00000002u,
        /* ... */
        SOME_FLAG_Z = 0x80000000u,
};

uint32_t a;
a = SOME_FLAG_Z;

假设32位整数... 在C语言中有效吗?

这个标准对我来说似乎模棱两可。

编辑:

引用标准

  

6.4.4.3枚举常量

     

语义学

     

2声明为枚举常量的标识符的类型为int。     前向引用:枚举说明符(6.7.2.2)。

     

6.7.2.2枚举说明符

     

约束

     

2定义枚举常量值的表达式应     是一个整数常量表达式,其值可表示为     

     

语义学

     

3枚举器列表中的标识符被声明为以下常量:     具有int类型,并且可能出现在允许的任何位置。127)一个     带有=的枚举数将其枚举常量定义为     常数表达式。如果第一个枚举数没有=,则其值     枚举常量为0。每个后续的没有=的枚举器定义     其枚举常量作为常量表达式的值     将上一个枚举常数的值加1得到的值。     (将枚举数与=一起使用可能会产生带有     与相同枚举中的其他值重复的值。)     枚举的枚举器也称为其成员。

     

4每个枚举类型应与char(带符号整数)兼容     类型或无符号整数类型。类型的选择是     128),但应能够代表     枚举的所有成员的值。枚举类型是     直到紧接终止列表的}之后才是不完整的     枚举器声明,然后完成。

C11 draft

约束似乎清楚地表明一个枚举是一个int,但是6.7.2.2_4似乎允许使用无符号int ??

1 个答案:

答案 0 :(得分:3)

您的代码无效:

C90(6.5.2.2,枚举说明符):

  

约束

     

定义枚举常量值的表达式应该是整数常量表达式,其值可以表示为int

C99(C11草案中未更改)(6.7.2.2,枚举说明符):

  

约束

     
      
  1. 定义枚举常量值的表达式应为整数常量表达式,其值可表示为int
  2.   

您的值超出了32位int的范围,因此这是一个错误(需要诊断)。

请注意,这完全与枚举常量的“初始化程序”有关。例如,如果我们有

enum foo { BAR = 42u };

然后,该约束表明值42u必须能够容纳在int中(确实如此;它只是无符号的42,而42容纳在int中)。 / p>

BAR本身的类型为int(令人惊讶的是,不是enum foo)。

但是,如果您声明类型为enum foo的变量,则其大小和签名由实现定义。它将基于一些现有的整数类型(可以存储所有枚举值),但是实际使用的类型在实现之间(以及在不同的enum类型之间也可以不同)。