std::hex用于切换cout后续整数为小写十六进制输出,需配合std::dec恢复十进制,std::showbase加前缀,std::uppercase转大写,std::setw与std::setfill实现补零对齐。

用 std::hex 切换到十六进制输出
直接在 cout 流中插入 std::hex 即可切换后续整数的输出为十六进制(小写):
#includeint main() { std::cout << std::hex << 255 << " " << 16 << "\n"; // 输出:ff 10 }
注意:std::hex 是流操纵器(manipulator),只影响**后续的整数输出**,且会持续生效,直到被其他进制操纵器覆盖。
- 它对浮点数、字符串、字符等类型无影响
- 不会自动补前缀
0x,如需显示,得手动输出"0x" - 大小写默认是小写(
a-f),大写需配合std::uppercase
控制大小写与前缀:std::uppercase 和 std::showbase
要输出 0xFF 这样的格式,必须组合使用三个操纵器:
-
std::hex:启用十六进制 -
std::showbase:添加进制前缀(0x或0X) -
std::uppercase:使字母大写(A-F)
顺序无关,但建议统一放在开头:
立即学习“C++免费学习笔记(深入)”;
std::cout << std::hex << std::showbase << std::uppercase << 255; // 输出:0XFF
如果不加 std::uppercase,即使有 std::showbase,也是 0xff;反之,不加 std::showbase 就永远没前缀。
恢复默认十进制或切换其他进制
std::hex 的影响是持久的,容易导致后续输出意外变成十六进制。常见做法是显式切回十进制:
- 用
std::dec恢复十进制(最常用) - 用
std::oct切换八进制 - 用
std::resetiosflags清除所有格式标志(较重,一般不必要)
推荐写法:
std::cout << std::hex << 255 << " "; // ff std::cout << std::dec << 255 << "\n"; // 255
漏掉 std::dec 是新手最常踩的坑——调试时发现数字全“变样”了,其实只是流状态没重置。
用 std::setfill 和 std::setw 补零对齐
十六进制常用于内存/寄存器显示,需要固定宽度(如 4 位:00ff)。此时要搭配宽度和填充字符:
-
std::setw(n):设置下一次输出的最小字段宽度(仅对下一个输出项有效) -
std::setfill('0'):设置填充字符(持续生效,直到再次调用)
示例:
#includestd::cout << std::hex << std::setfill('0') << std::setw(4) << 255; // 输出:00ff
注意:std::setw 只作用于紧随其后的那个输出项;std::setfill 会一直保留,所以如果之后还要输出十进制数字,记得也用 std::dec + std::setw 配合,否则可能意外补零。
进制切换本身不难,真正容易出问题的是流状态的「残留效应」——一个 std::hex 可能悄悄影响几行甚至几个函数之外的输出。务必养成配对使用(如 hex/dec)或限定作用域(比如封装成临时流)的习惯。











