要输出带0x前缀的十六进制数,需同时使用std::hex和std::showbase;如需大写字母用std::uppercase;固定宽度需配合std::setw与std::setfill;c++20推荐更安全、无状态的std::format。

用 std::hex 和 std::showbase 输出带 0x 的十六进制
直接用 std::hex 只会输出纯数字,比如 255 变成 ff,不带前缀。要加 0x,必须配合 std::showbase —— 它的作用就是让整数输出时带上进制前缀(0x 对十六进制,0 对八进制)。
示例:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
#include <iostream>
#include <iomanip>
int main() {
std::cout
<ul>
<li>
<code>std::showbase</code> 是流操纵器,影响后续所有整数输出,不是一次性开关</li>
<li>它只对整数类型生效(<code>int</code>、<code>long</code> 等),对 <code>float</code> 或 <code>double</code> 无效</li>
<li>如果之后还要输出十进制,记得用 <code>std::noshowbase</code> 关闭,否则可能意外带上 <code>0</code>(八进制)或 <code>0x</code>
</li>
</ul>
<h3>控制字母大小写:用 <code>std::uppercase</code> 或 <code>std::nouppercase</code>
</h3>
<p>默认十六进制字母是小写(<code>a-f</code>),但很多协议、调试场景要求大写(<code>A-F</code>)。这时候不能靠字符串替换,得用流标志。</p>
<p>示例:</p>
<pre class="brush:php;toolbar:false;">std::cout
-
std::uppercase让x和十六进制字母都大写(0XFF中的X也变大写) - 如果只要字母大写、前缀保持小写
0x,标准流不支持这种混合模式,得手动拼接或用sprintf/std::format(C++20) -
std::nouppercase可以恢复小写,但它不重置前缀大小写——0X变成0x需要先noshowbase再showbase
补零到固定宽度:用 std::setw 和 std::setfill
只加 0x 不够,实际开发中常需要固定位宽,比如地址打印成 0x0000abcd。这时要组合宽度和填充字符。
注意:std::setw 只对**下一个输出项**生效,且必须和 std::setfill 配合才有效果。
std::cout
-
std::setw(8)指的是整个输出字段宽度(含0x),不是纯数字部分。所以0xabcd实际占 6 字符,还需补 2 个0 - 如果想让数字部分固定 8 位(即总宽为 10),得算上
0x,设std::setw(10) -
std::setfill是持久的,直到被再次调用;但std::setw不是,每次都要重设
C++20 起推荐用 std::format 替代流操作
流操作容易出错:状态残留、宽度只作用一次、大小写和前缀耦合紧。C++20 的 std::format 更直观、无状态、可读性高。
#include <format> #include <iostream> std::cout <ul> <li>格式说明符语法接近 Python,<code>:x</code> 是小写十六进制,<code>:X</code> 是大写,<code>:08x</code> 表示 8 位、左补 0</li> <li>不污染流状态,每次调用独立,避免 <code>std::showbase</code> 忘关导致后续输出异常</li> <li>编译期检查格式串,比流操纵器更安全;但需确认编译器支持(GCC 13+/Clang 15+/MSVC 19.32+)</li> </ul> <p>老项目用流没问题,但新代码或需要精确控制格式的地方,<code>std::format</code> 的表达力和可靠性明显更高,尤其当逻辑里混着多种进制、宽度、符号时,流状态容易互相干扰。</p></iostream></format>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










