【发布时间】:2016-10-05 16:16:07
【问题描述】:
我正在寻找在 C 中 typedef enum 中使用十六进制的原因。
我点击了以下链接,但有两个答案: c, obj c enum without tag or identifier
LearnCocos2D 说,“使用十六进制数字没有任何好处,特别是从 a 到 f(10 到 15)开始十六进制数字是没有意义的。”
Sulthan 说,“当整数是二进制掩码时,通常使用十六进制数”。我搜索了二进制掩码,并通过以下链接了解它是位图游戏中使用的一种技术https://en.wikipedia.org/wiki/Mask_(computing)
如果 sulthan 是对的,请帮助我理解它。
我没有足够的声誉来发表评论,所以我创建了这个作为新问题。
【问题讨论】:
-
要了解为什么要在枚举中使用十六进制,您需要了解为什么要使用十六进制。 typedef 枚举真的没有什么特别之处。
-
可以使用十六进制,因为在正确的上下文中,它对程序员来说比十进制更具可读性,尽管对于初学者来说,在他们熟悉十六进制之前它可能看起来不太可读.您提到了位掩码,它在头脑中更容易从十六进制转换为二进制,而不是十进制,并且不知何故,它使它们的预期用途更加明显:作为掩码而不是值。例如,掩码可能会隔离处理器寄存器中的特定位,而不是用作计算的值。
-
当使用
int范围之外的十六进制值时,会出现使用十六进制表示法的缺点。使用 4 字节int/unsigned:0x80000000是 UB,因为它违反了“枚举常量应为整数常量表达式,其值可表示为int”。即使它看起来不错。然而,大多数编译器以通常希望的方式处理这个问题。 -
@chux:这不仅仅是未定义的行为,而是违反约束;任何符合标准的编译器都必须至少发出警告。 (默认情况下,gcc 显然不会对此发出警告。默认情况下,gcc 不是符合标准的 C 编译器。)
-
@KeithThompson 也许我的观点表述得不好。 MSVC 不使用
#define INT_MIN (-2147483648),因为取反的值是从一个正值开始的,不能用 32 位的int表示,这是我认为 chux 写的。