最稳妥方法是用 std::hex、std::setw(8)、std::setfill(‘0’) 配合,确保正数补零(如15→”0000000f”)、负数按补码截取(如-1→”ffffffff”),避免符号位干扰和位宽不一致。

用 std::stringstream 转 int 到 16 进制字符串最稳妥
直接写 std::hex 不够,必须搭配 std::setw 和 std::setfill 才能控制位宽和前导零。否则负数会出问题,正数也可能缺前导零或带符号位。
- 默认不补零,
15变成"f",不是"0f" - 负数走补码路径,
-1会输出很长一串"ffffffff"(32 位平台),不是你想要的符号+十六进制 - 要固定 8 位小写带前导零:先
ss - 务必转成无符号类型再格式化,避免符号扩展干扰
sprintf / snprintf 快但得手动管缓冲区
比 std::stringstream 快一截,适合性能敏感场景,但容易踩缓冲区溢出或格式符错配的坑。
-
snprintf(buf, sizeof(buf), "%08x", (unsigned int)x)是安全写法;用sprintf就得自己算长度 -
%x对负数行为未定义,必须强转unsigned int,否则结果不可靠 - 目标缓冲区太小会导致截断,
snprintf返回值是「本该写的长度」,可用来判断是否溢出 - Windows 下注意
_snprintf和snprintf行为差异:前者不保证末尾加