实际上在Visual 2013下编译C++,std::hex
(粘性运算符)的行为不是我所期望的:
我正在尝试打印一个字符作为其十六进制值,但我被迫掩盖或投射我的值以获得想要的行为。
所以我的问题不是怎么做,而是为什么。
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 可视化实现中的错误吗?我和std::ios::hex
混淆了吗?
char
的operator<<
重载按原样打印字符值,因此它们不会格式化为整数(这会受到格式标志的影响),而是格式化为字符。
带有掩码的行碰巧有效,因为几乎所有算术和按位运算符都将小整数(signed
/unsigned
char
和short
)提升为"常规大小"的整数(根据某些规则int
或unsigned int
),因此您实际上是在调用operator<<
以进行int
。
要使其在不遮罩的情况下工作,只需将强制转换添加到int
.
std::cout << std::hex << int(valueInChar);