为什么 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
吗?
char
的 operator<<
重载按原样打印字符值,因此它们不会被格式化为整数(这会受到格式化标志的影响),而是被格式化为字符。
带有掩码的行恰好有效,因为几乎所有算术和按位运算符都将小整数(signed
/unsigned
char
和 short
)提升为 "regular sized" 个(int
或 unsigned int
,根据某些规则),所以您实际上是在为 int
.
调用 operator<<
要使其在没有屏蔽的情况下工作,只需向 int
添加一个强制转换即可。
std::cout << std::hex << int(valueInChar);
实际在 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
吗?
char
的 operator<<
重载按原样打印字符值,因此它们不会被格式化为整数(这会受到格式化标志的影响),而是被格式化为字符。
带有掩码的行恰好有效,因为几乎所有算术和按位运算符都将小整数(signed
/unsigned
char
和 short
)提升为 "regular sized" 个(int
或 unsigned int
,根据某些规则),所以您实际上是在为 int
.
operator<<
要使其在没有屏蔽的情况下工作,只需向 int
添加一个强制转换即可。
std::cout << std::hex << int(valueInChar);