std::hex 和 std::dec 会永久改变流的整数输出进制,持续生效直至被另一进制操纵器覆盖;调用 std::hex 后,该流所有后续整数输出均默认为十六进制。

std::hex 和 std::dec 是作用于流对象(如 std::cout)的格式操纵器,它们会**永久改变该流后续整数输出的进制**,直到被另一个进制操纵器覆盖。不是“切换一次就只影响下一次”,而是持续生效。
std::hex / std::dec 会影响整个流的状态
一旦对某个流调用 std::hex,之后所有通过该流输出的整数(int、long 等)默认都按十六进制输出,除非显式重置为 std::dec 或 std::oct:
std::cout << std::hex << 255 << " " << 16 << "\n"; // 输出:ff 10 std::cout << std::dec << 255 << " " << 16 << "\n"; // 输出:255 16
注意:std::hex 不影响浮点数、字符串或指针的输出格式;它只对整型值的 operator 生效。
std::hex 和 std::dec 是流操纵器,不是函数调用参数
它们不能传给函数或作为变量保存,必须直接用于流表达式中(通常用 连接):
立即学习“C++免费学习笔记(深入)”;
- ✅ 正确:
std::cout - ❌ 错误:
std::hex(x);(无此函数) - ❌ 错误:
auto f = std::hex;(不可取址,不是普通函数对象)
它们是无状态的、轻量级的流操纵器,底层是函数指针或函数对象类型,专为流插入操作符设计。
避免意外残留:在局部控制时记得恢复
如果只希望某次输出用十六进制,又不想影响后续代码,常见做法是临时保存/恢复流格式标志:
std::ios_base::fmtflags f = std::cout.flags(); // 保存当前格式 std::cout << std::hex << 4095; std::cout.flags(f); // 恢复原始格式
更安全的替代方式(推荐)是使用 std::ostringstream 隔离格式:
std::ostringstream oss; oss << std::hex << 4095; std::string hex_str = oss.str(); // "fff" // std::cout 不受影响
直接在 std::cout 上反复切进制容易遗漏恢复,尤其在函数中途返回或异常路径中——这是最常被忽略的隐患。
std::hex 不控制大小写和前缀,需额外设置
std::hex 默认输出小写字母(a-f),且不带 0x 前缀。若需要大写或前缀,得配合其他操纵器:
-
std::uppercase→ 输出FF而非ff -
std::showbase→ 输出0xff或0XFF(取决于是否uppercase)
std::cout << std::hex << std::showbase << std::uppercase
<< 255 << "\n"; // 输出:0XFF
这些标志同样持久生效,和 std::hex 一样,容易一设忘收。










