关于std::byte的to_integer<uint8_t>输出字符而非整数的疑问
这完全是预期行为哦!
别担心,你遇到的不是Bug,这是C++标准和编译器类型定义共同导致的正常现象,和操作系统关系不大。
为啥会出现这种差异?
问题的核心在于uint8_t的底层类型:在几乎所有主流编译器(包括你用的VS Build Tools)里,uint8_t其实就是unsigned char的别名。而std::cout处理char或unsigned char类型时,默认是输出对应的ASCII字符,而不是它的数值。
反观uint16_t,它是独立的整数类型(一般对应unsigned short),cout会直接输出它的数值,所以你看到的是80。
看你的代码:
std::byte test_byte{80}; std::cout << "Test: " << std::to_integer<uint8_t>(test_byte) << " vs " << std::to_integer<uint16_t>(test_byte) << "\n";
std::to_integer<uint8_t>(test_byte)返回的是unsigned char类型的80,cout把它当成ASCII字符解析,刚好80对应的是大写字母'P',所以输出'P'。std::to_integer<uint16_t>(test_byte)返回的是uint16_t类型的80,cout按整数输出,所以显示80。
想让uint8_t输出数值怎么办?
如果希望uint8_t的结果也显示成数字,只需要把它显式转换成一个更大的整数类型就行,比如int:
std::cout << "Test: " << static_cast<int>(std::to_integer<uint8_t>(test_byte)) << " vs " << std::to_integer<uint16_t>(test_byte) << "\n";
这样运行后输出就会变成Test: 80 vs 80啦。
内容的提问来源于stack exchange,提问作者Tomas Berger
相关产品推荐
相关产品推荐

