std::hex 配合 std::showbase 才能输出带 0x 前缀的十六进制数;仅用 std::hex 只输出纯数字,std::showbase 是持续生效的流操纵器,需用 std::noshowbase 关闭。

用 std::hex 和 std::showbase 输出带 0x 前缀的十六进制
默认用 std::hex 只会输出纯数字(比如 ff),不带 0x。要加前缀,必须配合 std::showbase —— 它告诉 cout 在输出八进制或十六进制时自动加前缀(0 或 0x)。
常见错误是只写 std::hex,结果怎么都看不到 0x。另外,std::showbase 是流操纵器,不是一次性开关,它会影响后续所有整数输出,直到被 std::noshowbase 关闭。
std::cout → 输出 <code>0xff- 如果不加
std::showbase,std::hex 就只输出 <code>ff -
std::showbase对十进制无效,只对std::hex和std::oct生效
控制宽度和补零:用 std::setw 和 std::setfill
加了 0x 后,很多人发现补零失效了——比如想输出 0x00ff,但只写了 std::setfill('0') ,结果却是 <code>0xff(宽度只算数字部分,不含 0x)。
这是因为 std::setw 的“宽度”包含前缀,但 std::setfill 只在字段总宽不足时才生效,且填充位置在前缀之后、数字之前。
- 正确写法:
std::cout → <code>0x00ff(6 位含0x,所以数字占 4 位) -
std::setw(4)对255无效,因为0xff已占 4 字符,不触发填充 - 如果先设
std::setw再设std::hex,宽度可能被忽略——顺序很重要,一般把格式设置放在最前面
避免影响后续输出:记得恢复默认状态
std::showbase、std::hex、std::setfill 都是流的持久状态。一旦设置,后面所有 cout 整数输出都会受影响,容易引发隐蔽 bug(比如日志里突然冒出一堆 0x)。
- 推荐做法:用作用域限制,或显式还原:
std::cout -
std::dec必须显式调用,不能依赖“默认”,因为前一个std::hex会持续生效 - 如果只是临时输出,可考虑封装成函数或用
std::ostringstream隔离状态,避免污染全局cout
替代方案:用 std::format(C++20)更可控
如果你用的是 C++20 或更新标准,std::format 是更现代、更安全的选择,它不改变流状态,也更容易控制前缀和宽度。
std::cout → <code>0xff(#表示带前缀)std::cout → <code>0x00ff(06表示最小总宽 6,含前缀,不足则补零)- 注意:
std::format目前在某些旧编译器(如 GCC 12 默认)仍需开启-std=c++20 -D_GLIBCXX_USE_CXX11_ABI=1才能用
前缀、宽度、填充这些细节,在 std::cout 流操作里是耦合在一起的,稍不注意就漏掉某个环节;而 std::format 把它们全写在格式串里,反而更不容易出错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











