C++ 怎么输出十六进制 C++ hex操纵符格式化输出【IO】

1次阅读

std::hex 输出十六进制需配合 std::showbase 才能显示 0x 前缀,否则默认无前缀;它仅切换基数,不控制大小写、填充或宽度。

C++ 怎么输出十六进制 C++ hex操纵符格式化输出【IO】

std::hexc++ 标准库中用于切换整数输出为十六进制的流操纵符,但它只影响后续整数的基数,不控制大小写、前缀、填充或字段宽度——这些必须额外配置。

怎么让 std::hex 输出带 0x 前缀

默认情况下 std::hex 不加前缀。要输出 0x,需配合 std::showbase

int x = 255; std::cout << std::hex << std::showbase << x; // 输出: 0xff
  • std::showbasestd::hex 添加 0x,对 std::oct 添加 0,对 std::dec 无效果
  • 前缀是“显示属性”,不是格式字符串的一部分,不能用 std::setfill 影响其对齐
  • 取消前缀用 std::noshowbase

怎么控制字母大小写(a-f 还是 A-F

std::hex 默认输出小写字母;大写需搭配 std::uppercase

std::cout << std::hex << std::uppercase << 255; // 输出: FF
  • std::uppercase 同时影响科学计数法中的 e 和十六进制字母
  • 恢复小写用 std::nouppercase
  • 注意:它不改变数字本身,只改变字母和指数符号的大小写

怎么补零到固定位宽(比如总是 4 位:00ff

std::hex 本身不补零;需组合 std::setwstd::setfill

立即学习C++免费学习笔记(深入)”;

int x = 255; std::cout << std::hex << std::setw(4) << std::setfill('0') << x; // 输出: 00ff
  • std::setw 只对**下一个输出项**生效,不可复用,每次都要重设
  • std::setfill 是持久的,设一次可影响后续多个输出(直到再改)
  • 若同时用了 std::showbasestd::setw 计算的是整个带前缀的宽度(如 std::setw(6) + 0x → 填充 4 个字符)

为什么 std::hex 对浮点数或字符串没用

std::hex 仅对整型intlongunsigned short 等)起作用,对 Floatdoublestd::String指针值无效:

  • 输出浮点数的十六进制表示要用 std::hexfloat(C++11 起),例如:std::cout
  • 输出指针地址默认就是十六进制,但不带 0x 前缀;加前缀仍需 std::showbase
  • 想把字符串按字节转成 hex(如 "AB" → "4142"),得手动遍历每个 unsigned char 并用 std::hex 输出

最易忽略的一点:所有这些操纵符(std::hexstd::showbasestd::uppercase)都是流状态,一旦设置就会持续生效,直到被显式关闭或覆盖——在多线程或函数复用场景下,不重置可能污染其他输出。

text=ZqhQzanResources