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

std::hex 是 C++ 标准库中用于切换整数输出为十六进制的流操纵符,但它只影响后续整数的基数,不控制大小写、前缀、填充或字段宽度——这些必须额外配置。
怎么让 std::hex 输出带 0x 前缀
默认情况下 std::hex 不加前缀。要输出 0x,需配合 std::showbase:
int x = 255; std::cout << std::hex << std::showbase << x; // 输出: 0xff
-
std::showbase对std::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::setw 和 std::setfill:
立即学习“C++免费学习笔记(深入)”;
int x = 255;
std::cout << std::hex << std::setw(4) << std::setfill('0') << x; // 输出: 00ff
-
std::setw只对**下一个输出项**生效,不可复用,每次都要重设 -
std::setfill是持久的,设一次可影响后续多个输出(直到再改) - 若同时用了
std::showbase,std::setw计算的是整个带前缀的宽度(如std::setw(6)+0x→ 填充 4 个字符)
为什么 std::hex 对浮点数或字符串没用
std::hex 仅对整型(int、long、unsigned short 等)起作用,对 float、double、std::string 或指针值无效:
- 输出浮点数的十六进制表示要用
std::hexfloat(C++11 起),例如:std::cout - 输出指针地址默认就是十六进制,但不带
0x前缀;加前缀仍需std::showbase - 想把字符串按字节转成 hex(如 "AB" → "4142"),得手动遍历每个
unsigned char并用std::hex输出
最易忽略的一点:所有这些操纵符(std::hex、std::showbase、std::uppercase)都是流状态,一旦设置就会持续生效,直到被显式关闭或覆盖——在多线程或函数复用场景下,不重置可能污染其他输出。










