使用 std::hex 需配合 std::showbase 加 0x 前缀、std::uppercase 控制大小写、std::setw 与 std::setfill 补零;负数按补码输出,指针须转 uintptr_t;推荐封装函数统一格式。
直接用配合即可输出十六进制,但默认不补零、不带前缀、大小写和字段宽度需手动控制——这些恰恰是实际开发中最常出错的地方。
怎么让 cout 输出带 0x 前缀的十六进制
仅用
不会自动加
,必须搭配
:
对
生效时加
,对
加
,对
无影响
前缀大小写由后续是否启用
决定(见下一条)
一旦设置
,它会持续生效,直到被
关闭
怎么控制字母大小写和补零位数
十六进制字母默认小写,数字不自动补零;需分别用
和
+
:
影响前缀(
)和字母(
),不是只改字母
只对下一个输出项生效,必须和
配合才能补零
如果要固定 8 位(如打印指针或寄存器值),常用
为什么 int 类型负数输出结果看起来“不对”
因为
直接按二进制补码解释整数,不会做符号扩展或转换处理:
C函数速查手册(CHM版)
C函数速查手册(CHM版)
下载
立即学习
“
C++免费学习笔记(深入)
”;
这不是 bug,而是底层位模式的直接呈现。-1 的 32 位补码就是全 1
若想输出带符号的十六进制(比如显示为
),C++ 标准流不支持,得自己判断正负后手动拼接
更安全的做法:对负数先转成无符号类型再输出,例如
输出指针地址时的常见陷阱
直接用
输出指针会报错或行为未定义,必须先转成
:
不能对
直接用
+
,某些编译器会调用重载的指针输出(即显示地址但不走 hex 流控)
是能容纳指针的无符号整数类型,来自
若需统一格式(如 16 进制小写+0x+16 位宽),建议封装成函数,避免每次重复写一长串 manipulator
真正麻烦的从来不是“怎么打出十六进制”,而是“怎么让每种场景下的输出都稳定、可读、符合协议”——尤其是混合调试日志、内存 dump 和协议字段打印时,
的状态残留、
作用域
、有符号/无符号混用,最容易在深夜排查问题时悄悄翻车。
std::hexstd::cout0xstd::hex0xstd::showbase#include
int main() {
std::cout << std::hex << std::showbase << 255 << '\n'; // 输出: 0xff
} std::showbasestd::hex0xstd::oct0std::decstd::uppercasestd::showbasestd::noshowbasestd::uppercasestd::setwstd::setfill#include
std::cout << std::hex << std::uppercase << std::showbase
<< std::setw(4) << std::setfill('0') << 255 << '\n'; // 输出: 0X00FF std::uppercase0XA-Fstd::setwstd::setfillstd::setw(8) << std::setfill('0')std::hexstd::cout << std::hex << -1 << '\n'; // 在 32 位系统上通常输出: ffffffff-0x1static_cast(x) std::hexuintptr_t#include
int x = 42;
std::cout << std::hex << std::showbase
<< reinterpret_cast(&x) << '\n'; void*<<std::hexuintptr_tstd::hexsetw