You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:32:14