【发布时间】:2014-07-17 11:29:31
【问题描述】:
我的理解是C++枚举是根据Integral Promotion转换成整型的。在积分促销期间,我们应该先尝试将值转换为int,如果该值不能用int表示,则应使用unsigned int:
C++03 conv.prom:
2) .... 枚举类型 (7.2) 的右值可以转换为右值 可以表示所有值的以下类型中的第一个 枚举的值(即 bmin 到 bmax 范围内的值 在 7.2 中描述:int、unsigned int、long 或 unsigned long。
但我在 VC++2010 中的测试显示出矛盾的结果:
enum {A1=60, A2=61,A3=63,A4=64,A5=66,A6=0xffffFFF1};
const bool b1 = A6 < A1;
//result b1=true;
A6 是 0xffffFFF1,它应该是一个无符号值(十进制 4294967281)。而且,由于该值不能用int 表示,因此应将其转换为unsigned int。但很明显,在比较中使用时,A6 被转换为 -15。为什么会这样?
【问题讨论】:
-
仅供参考,它可以在 Clang 3.4 上正常工作。
-
我倾向于不同意提供的链接stackoverflow.com/questions/159034/… 中的所有答案。枚举是一种没有符号的独特类型。当我们在需要签名的上下文中使用它时,我们正在谈论将枚举转换为某种整数类型,这是一个定义明确的动作。它被称为 Integral Promotion - 与枚举的基础类型无关。
标签: c visual-c++ enums c++03