如下代码:为什么声明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;
}
如下代码:为什么声明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 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
%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
) 不会。