c - C 中枚举类型的溢出?

标签 c enums integer-overflow

如果我有枚举类型,例如:

枚举周{ sunday=0, monday, tuesday, wednesday, thursday, friday, saturday};

我有:

enum week day;
day = saturday;
day++;

一天的值(value)是多少?

最佳答案

枚举类型本质上是一个命名的整数值。该枚举类型与可以表示所有命名值的基础整数类型相关联。该基础整数类型需要能够表示所有唯一的命名值,但其实际类型是实现定义的。

在这种情况下,saturday 的数值将为 6。递增它将给出 7 的数值。实际上,这不太可能溢出底层整数类型(intcharunsigned char 或编译器选择的任何类型),因此打印使用 %d 格式的值将打印 7

但是,不存在值为 7enum week 类型的枚举(命名)值。

如果递增枚举值会溢出基础整数类型(这里不是这种情况),则结果是未定义的。这是因为底层整数类型可能是有符号或无符号的,溢出有符号整数类型会导致未定义的行为。

理论上,编译器可能会为 enum week 使用底层类型,它只能表示值 06 -在这种情况下,递增 saturday 会产生未定义的行为。实际上,AFAIK,还没有任何 C 编译器不选择底层类型作为标准整数类型之一(charint unsigned charunsigned 等)。所有这些类型都可以表示 7 的数值。

关于c - C 中枚举类型的溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408698/

相关文章:

c - C语言中如何复制结构体数据?

java - Struts2 - 如何访问嵌套枚举

java - 相同的方法,不同的枚举,如何设计父类?

java - 如何从 Enum 返回一个实例?

c - 找到两个值的平均值的正确方法是什么?

c - Malloc 结构数组。

c - 为什么卷积函数不打印?

c - 如何检查数字是否溢出 'int'

c++ - 预期溢出但添加两个字节不会

比较 char 数组的两个值