【问题标题】:Sign of C++ Enum Type Incorrect After Converting to Integral Type转换为整数类型后 C++ 枚举类型的符号不正确
【发布时间】: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;

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

【问题讨论】:

  • 仅供参考,它可以在 Clang 3.4 上正常工作。
  • 我倾向于不同意提供的链接stackoverflow.com/questions/159034/… 中的所有答案。枚举是一种没有符号的独特类型。当我们在需要签名的上下文中使用它时,我们正在谈论将枚举转换为某种整数类型,这是一个定义明确的动作。它被称为 Integral Promotion - 与枚举的基础类型无关。

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


【解决方案1】:

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

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

C++ 标准本身也存在与枚举相关的缺陷。我也描述了 here

还有一个关于枚举讨论的参考资料(此时为英文)可以访问here

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多