【问题标题】:can an enum hold unsigned integers greater than INT_MAX?枚举可以保存大于 INT_MAX 的无符号整数吗?
【发布时间】:2018-12-08 11:11:57
【问题描述】:
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 似乎允许无符号整数¿?

【问题讨论】:

  • 对于 32 位 int 然后 0x8000u 甚至没有接近极限。你的意思是0x80000000u
  • 您介意引用这个模棱两可的表述吗?
  • 是的,我的意思是,谢谢 :)

标签: c enums unsigned-integer


【解决方案1】:

您的代码无效:

C90(6.5.2.2,枚举说明符):

约束

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

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

约束

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

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

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

enum foo { BAR = 42u };

那么这个约束说明42u 的值必须能够适应int(确实如此;它只是一个无符号的42 和42 适合int)。

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

但是如果你声明一个enum foo 类型的变量,那么它的大小和符号是实现定义的。它将基于一些现有的整数类型(可以存储所有枚举值),但实际使用的类型可能因实现而异(以及不同的enum 类型之间)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多