电话
400 9058 355
std::hex 是作用于整个输出流的持久性操纵符,会持续将后续整数转为小写十六进制且无前缀,需用 std::dec 等显式恢复。
std::hex 和 std::cout 输出整数的十六进制形式直接用 std::hex 会把后续所有整数输出都切为十六进制,且不带前缀(比如没有 0x),也不控制大小写或补零。它只是个流操纵符,作用于整个输出流,不是一次性的格式修饰。
常见错误是以为写了 std::hex 就只影响下一项——其实它会持续生效,直到被另一个进制操纵符(如 std::dec)覆盖:
int a = 255, b = 16; std::cout << std::hex << a << " " << b << std::endl; // 输出:ff 10 std::cout << a << std::endl; // 仍是 ff(因为 hex 还在生效)
std::dec 回到十进制,或用 std::ios_base::fmtflags 保存/恢复状态std::hex 只对整型有效(int、long、unsigned short 等),对 float 或 double 无效,也不会报错,而是按默认浮点格式输出a-f),想大写需配合 std::uppercase
0x 前缀和补零要用 std::showbase 和 std::setfill/std::setw
std::showbase 让 std::hex 自动加 0x(对 std::oct 加 0,std::dec 无效果),但它不控制宽度;补零得靠 std::setfill('0') + std::setw(n),而且 setw 只对**下一个输出项**生效:
#includeint x = 15; std::cout << std::hex << std::showbase << std::setfill('0') << std::setw(4) << x << std::endl; // 输出:0x000f
std::setw 不会保留,每次都要重设;漏写就变成不补零std::setfill 是持久的,设一次会影响后续所有需要填充的输出(比如之后再用 setw 输出字符串,也会用 '0' 填充)std::format(C++20)或 sprintf 避免状态污染std::format 替代流操纵符做十六进制格式化std::format 是无状态、一次性的,语义清晰,不易出错,支持前缀、大小写、宽度、对齐等全部控制,且类型安全:
#includeint v = 255; std::string s1 = std::format("{:#x}", v); // "0xff" std::string s2 = std::format("{:04x}", v); // "00ff" std::string s3 = std::format("{:#06X}", v); // "0X00FF"
{:#x} → 带 0x 前缀;{:04x} → 宽度 4、左补零、小写;X 表示大写std::hex 的“传染性”问题fmt 库替代std::hex
直接对指针用 std::hex 会导致未定义行为或编译失败(尤其开启严格检查时)。正确做法是先转成 uintptr_t,再格式化:
int val = 42; int* p = &val; std::cout << std::hex << reinterpret_cast(p) << std::endl; // OK // 错误写法:std::cout << std::hex << p << std::endl; // 不可移植,可能崩溃
%p 配合 printf,或 C++20 的 std::format("{:p}", p)
std::hex 对指针无标准语义,不同平台输出可能截断、乱码甚至 crash
十六进制输出最易踩的坑不是语法写错,而是流状态残留和指针误用——前者让后续输出莫名其妙变进制,后者在不同平台表现不一,调试起来特别隐蔽。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...