为什么 std::hex 不使用 char 打印为十六进制?

Why is std::hex not printing as hexadecimal specially with char?

实际在 Visual 2013 下编译 C++,std::hex(粘性运算符)的行为不是我所期望的:

我正在尝试打印一个 char 作为其十六进制值,但我不得不屏蔽或转换我的值以获得所需的行为。

所以我的问题不是怎么做,而是为什么。

char valueInChar = 0xc8; //decimal 200
std::cout << std::hex << valueInChar; //prints out ╚
std::cout << std::hex << (valueInChar & 0xFF); //prints out c8
std::cout << std::hex << int(valueInChar); //also prints out c8

这是标准视觉实现中的错误吗?我混淆了 std::ios::hex 吗?

charoperator<< 重载按原样打印字符值,因此它们不会被格式化为整数(这会受到格式化标志的影响),而是被格式化为字符。

带有掩码的行恰好有效,因为几乎所有算术和按位运算符都将小整数(signed/unsigned charshort)提升为 "regular sized" 个(intunsigned int,根据某些规则),所以您实际上是在为 int.

调用 operator<<

要使其在没有屏蔽的情况下工作,只需向 int 添加一个强制转换即可。

std::cout << std::hex << int(valueInChar);