转换为积分类型后C ++枚举类型的符号不正确

时间:2014-07-17 11:29:32

标签: c visual-c++ enums c++03

我的理解是根据Integral Promotion将C ++枚举转换为整数类型。在积分促销期间,我们应首先尝试将值转换为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;

A60xffffFFF1,它应该是无符号值(十进制4294967281)。并且,由于此值无法用int表示,因此应将其转换为unsigned int。但显然,在比较中使用时,A6被转换为-15。为什么会这样?

1 个答案:

答案 0 :(得分:3)

这是MS VC ++的一个错误。我描述了它here

虽然描述是用俄语写的,但您可以使用google service translate翻译成英文。

相对于C ++标准本身的枚举,也存在缺陷。我也描述过它 here

可以访问另一个与枚举讨论有关的参考(目前用英语)here