c++11中enum底层类型没有uint8_t吗

如下代码:为什么声明uint8_t时候,输出128的值会越界呢?

enum class Type : uint8_t {
    APPLE = 128;
};

int main(){
    printf("%u\n", Type::APPLE); //输出:4294967168
    //而如果强转后却输出未越界
    printf("%u\n", static_cast<uint8_t>(Type::APPLE));
    return 0;
}
阅读 3.6k
1 个回答

%u 期待读到一个 int 。但是 enum class Type 不是 int 。printf 当提供的类型跟期待的类型不一致的时候,是一个未定义行为,意味着什么都可能发生。(比如直接用 Type::APPLE 与用变量会出现不同的结果)

而使用 uint8_t 类型的变量作为函数参数的时候,会发生 integral promotion 。这个变量会被自动的转换为 int 。也就是说,printf("%u"\n", static_cast<uint8_t>(Type::APPLE));printf("%u"\n", static_cast<int>(static_cast<uint8_t>(Type::APPLE))); 的效果是一样的。于是可以读到正常的值。

unscoped enumeration (enum) 也会发生 integral promotion 。但是 scoped enumeration (enum class) 不会。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题