枚举的最后一个_BIG_ENUM = 0xFFFFFFFF是什么意思?

时间:2019-10-17 07:30:44

标签: c enums

我正在阅读一些代码,并在枚举的最后一个值中找到了_BIG_ENUM = 0xFFFFFFFF。这行的正确含义是什么。并且此_BIG_ENUM在代码中的任何地方都没有使用。

publish

2 个答案:

答案 0 :(得分:5)

没有任何意义,是一个错误。

我想程序员不太了解枚举的工作原理,并认为他们可以通过为枚举常量之一分配一个大的整数常量来强制枚举变为32位。的确如此,但是他们选择了一个错误的值,该值将不会像他们认为的那样起作用。

问题在于,尽管枚举变量可能具有实现定义的大小,但枚举常量(例如_BIG_ENUM)总是 输入int 1)

但是0xFFFFFFFF不能容纳在32位int中,因此这是一个错误。十六进制常量0xFFFFFFFF实际上是unsigned int类型(假定为32位),它不适合,因此将实现从有符号到无符号的实现定义的转换。意味着我们最终以2的补码系统中的值-1结束。尽管具有严格标准设置的gcc和clang甚至拒绝在枚举常量的整数常量大于INT_MAX的情况下编译代码。

面对值-1的枚举常量时,编译器可以自由选择任何带符号类型 2)来获取该类型的枚举变量,而不必是32位。

可以通过将代码更改为_BIG_ENUM=INT_MAX,(limits.h)来固定代码。然后枚举类型将变为intunsigned int


1) C17 6.7.2.2/1

  

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

2) C16 6.7.2.2/4

  

每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的(128),但应能够表示枚举的所有成员的值。

     

128)一个实现可能会延迟选择哪种整数类型,直到所有枚举常量都具有   被看到。

答案 1 :(得分:2)

某些编译器可以将枚举优化为较小的字长,但是当并非所有代码都使用同一编译器编译时,这可能会导致互操作性问题。

如果为枚举分配了32位值,则会阻止该优化,从而迫使该枚举被编码为32位整数。

相关问题