转换为积分类型后C ++枚举类型的符号不正确
我的理解是根据Integral Promotion将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。 为什么会这样?
这是MS VC ++的一个错误。 我在这里描述了它
尽管描述是用俄语写的,但您可以使用Google服务翻译将其翻译成英语。
此外,相对于C ++标准本身的枚举存在缺陷。 我在这里也有描述
还可以在此处访问有关枚举讨论(此时为英语)的另一个参考