C++字符串中十六进制值打印结果不符合预期的原因咨询
关于std::string中十六进制字符输出异常的问题
我看过其他关于字符串中十六进制的帖子,但对眼前的代码现象感到困惑。我的代码片段如下:
std::string st = "\xB5\x62"; printf("len is %d\n", st.length()); for (std::size_t i = 0; i < st.size(); ++i) { printf("as hex = %x\n", st[i]); printf("as dec = %d\n", st[i]); }
令我困惑的是\xB5的处理方式,实际输出为:
len is 2 as hex = ffffffb5 as dec = -75 as hex = 62 as dec = 98
对于十六进制的B5,我预期的十六进制输出是'B5'、十进制输出是'181',而非当前结果,请问这是怎么回事?
问题原因与解决方法
核心原因:char类型的符号性
你的编译器默认将char视为有符号类型(signed char):
- 十六进制
0xB5对应的二进制是10110101,作为有符号char时,最高位的1表示这是一个负数。通过补码计算,它的十进制值为-75(补码转原码:取反得01001010,加1得01001011即十进制75,最终结果为-75)。 - 当
signed char被传入printf时,会触发整数提升机制:负数会进行符号扩展,将8位的0xB5扩展为32位int的0xFFFFFFB5,这就是你看到输出ffffffb5的原因。
解决方法
输出时强制将字符转换为无符号类型,避免符号扩展:
std::string st = "\xB5\x62"; printf("len is %d\n", st.length()); for (std::size_t i = 0; i < st.size(); ++i) { printf("as hex = %hhx\n", static_cast<unsigned char>(st[i])); printf("as dec = %u\n", static_cast<unsigned char>(st[i])); }
%hhx是专门用于输出unsigned char的十六进制格式符,会输出两位十六进制数b5;%u用于输出无符号十进制数,会得到预期的181。
内容的提问来源于stack exchange,提问作者Andrew W.
相关产品推荐
相关产品推荐

