std::hex 是输出 int 十六进制最轻量安全的方式,仅影响后续整数输出,需配合 std::cout 使用,持续生效至被 std::dec 等覆盖;补零用 std::setfill 与 std::setw,加 0x 需手动写字符串,大写需 std::uppercase;流状态共享,多线程或函数中应保存恢复 flags。

cout 输出 int 的十六进制:用 std::hex 就够了
直接改流状态,不转字符串、不手写转换,std::hex 是最轻量也最安全的方式。它只影响后续整数输出的进制,不影响浮点数或字符串。
常见错误是以为要拼格式串(比如像 printf 的 "%x"),结果去查 format 或强转 std::stringstream,反而绕远路。
-
std::hex必须和std::cout(或其他 ostream)配合使用,单独写没效果 - 它会持续生效,直到被
std::dec、std::oct覆盖,或流析构 - 默认不补零、不加
0x前缀,输出就是纯十六进制数字(如2a而非0x2a)
#include <iostream>
int main() {
std::cout << std::hex << 42 << '\n'; // 输出: 2a
std::cout << 255 << '\n'; // 输出: ff(仍是 hex!)
}
补零、定宽、加前缀:靠 std::setfill 和 std::setw
想输出 0000002a 或 0x2a?std::hex 自己做不到,得组合操纵符。关键点在于:这些操纵符只对「下一个输出项」起作用,不是全局开关。
-
std::setw(n)设置下一项最小宽度,不足则用std::setfill指定字符填充(默认空格) -
std::setfill('0')要在std::setw前调用才有效,顺序不能反 - 加
0x得手动写字符串:"0x" ,别指望操纵符自动加
#include <iomanip>
std::cout << std::hex << std::setfill('0') << std::setw(8) << 42 << '\n';
// 输出: 0000002a
大写还是小写?std::uppercase 控制字母大小写
默认输出小写字母(a–f),要大写必须显式开启 std::uppercase。它和 std::hex 是正交的——可以同时用,也可以只用一个。
立即学习“C++免费学习笔记(深入)”;
-
std::uppercase对std::hex和std::scientific都生效,但对std::dec无效 - 关闭它要用
std::nouppercase,没有“自动恢复”这回事 - 注意:Windows 控制台默认不支持 Unicode,大写
A–F显示正常,但某些终端字体可能渲染异常(少见)
std::cout << std::hex << std::uppercase << 255 << '\n'; // 输出: FF
避免踩坑:流状态是共享的,多线程或函数复用时要小心
流对象(比如 std::cout)的状态是内部的、可变的。如果一个函数设置了 std::hex,又没还原,调用方后续输出就全乱了——尤其在日志函数、工具函数里容易忽略这点。
- 不要在通用函数里直接操作
std::cout的格式状态,优先用std::ostringstream局部处理 - 真要改
std::cout,记得用std::ios_base::fmtflags保存/恢复原始状态 -
std::hex不影响二进制读取,但如果你混用>>输入,输入解析仍按十进制,别误以为它也改输入行为
auto flags = std::cout.flags(); // 保存当前格式标志 std::cout << std::hex << 100; std::cout.flags(flags); // 恢复C++ 的流格式控制是“粘性”的,一旦设了就一直生效,不像 printf 那样每次调用都重置。这个特性省事也惹祸,多数 bug 都出在忘了它不自动清理。










