C++中的std::hex和std::dec怎么切换进制?(控制流对象的输出格式)

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

c++中的std::hex和std::dec怎么切换进制?(控制流对象的输出格式)

std::hexstd::dec 是作用于流对象(如 std::cout)的格式操纵器,它们会**永久改变该流后续整数输出的进制**,直到被另一个进制操纵器覆盖。不是“切换一次就只影响下一次”,而是持续生效。

std::hex / std::dec 会影响整个流的状态

一旦对某个流调用 std::hex,之后所有通过该流输出的整数(intlong 等)默认都按十六进制输出,除非显式重置为 std::decstd::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;(不可取址,不是普通函数对象)

它们是无状态的、轻量级的流操纵器,底层是函数指针或函数对象类型,专为流插入操作符设计。

BlessAI

BlessAI

Bless AI 提供五个独特的功能:每日问候、庆祝问候、祝福、祷告和名言的文本生成和图片生成。

下载

避免意外残留:在局部控制时记得恢复

如果只希望某次输出用十六进制,又不想影响后续代码,常见做法是临时保存/恢复流格式标志:

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 → 输出 0xff0XFF(取决于是否 uppercase
std::cout << std::hex << std::showbase << std::uppercase
          << 255 << "/n"; // 输出:0XFF

这些标志同样持久生效,和 std::hex 一样,容易一设忘收。

https://www.php.cn/faq/1981641.html

发表回复

Your email address will not be published. Required fields are marked *