为何std::hex输出unsigned char为字符而非十六进制字符串?
问题解答
为什么unsigned char会被当作字符处理?
C++标准库的std::ostream(即std::cout所属类)为char、signed char、unsigned char三种类型单独提供了输出重载,这些重载的行为就是输出对应ASCII编码的字符,而非它们的数值。所以不管你定义的是char还是unsigned char,直接用cout <<输出时,都会走字符输出逻辑,把0x41转换成ASCII字符'A'打印出来。
补充说明:虽然小整数类型(如char、short)传递给函数时会触发整数提升,但这里因为存在unsigned char的专属输出重载,重载匹配会优先选择精确匹配的版本,提升不会影响最终输出行为。
为什么std::hex无法输出十六进制字符串?
std::hex是控制数值类型输出格式的操纵符,仅对整数、浮点数这类数值类型的输出生效。而直接输出unsigned char时调用的是字符输出重载,该重载不会理会数值格式控制符,所以std::hex在这里完全不起作用。
如果想要输出unsigned char的十六进制数值,需要把它转换成明确的整数类型(比如unsigned int),让cout调用数值输出重载,示例代码如下:
std::cout << std::hex << static_cast<unsigned int>(x) << std::endl;
这样就能输出41了。
内容的提问来源于stack exchange,提问作者Keelung
相关产品推荐
相关产品推荐

