十六进制字面量以0x或0x开头,后接0-9、a-f或a-f字符;如0xff=255,大小写不敏感;漏前缀或误写x1a等将报错;输出需用std::hex配合std::showbase才显0x前缀。

十六进制字面量怎么写:前缀 0x 或 0X
直接在数字前加 0x(小写)或 0X(大写),后面跟合法的十六进制字符(0-9、a-f 或 A-F)。编译器会自动按十六进制解析并转成对应整数值。
常见错误现象:1A 会被当作十进制的 1A 报错(非法字符),x1A 或 h1A 不是标准写法,编译失败;漏掉前缀就只是普通十进制或八进制(如 010 是八进制 8)。
-
0xFF→ 十进制 255 -
0xff→ 同样是 255,大小写不敏感 -
0x0、0Xdeadbeef、0x7FFF都合法 - 不能写成
0x单独存在,也不能在中间加空格或下划线(C++14 起支持0xFF_AB这种带下划线的写法,但需确认编译器版本)
如何用 std::hex 控制输出格式
字面量本身没有“进制属性”,它只是初始化值的一种写法;真正影响打印的是 I/O 流的格式控制。默认 std::cout 输出为十进制,要显示为十六进制得显式设置 std::hex。
容易踩的坑:std::hex 是流状态,一旦设置会影响后续所有整数输出,不恢复的话可能干扰调试或日志;另外它不自动补 0x 前缀,也不控制位宽或大小写。
- 输出带前缀和小写:用
std::showbase+std::hex,例如std::cout → <code>0xff - 强制大写:再加
std::uppercase→0XFF - 固定宽度补零:配合
std::setw和std::setfill('0'),注意setw只对下一个输出项生效 - 记得重置:如需切回十进制,用
std::dec;否则后续cout可能意外输出十六进制
从字符串解析十六进制数:用 std::stoi 或 std::stoul
读配置、解析用户输入或网络数据时,常遇到形如 "FF" 或 "0x1A" 的字符串,需要用转换函数。关键点是传入进制参数 16,且函数能自动识别可选的 0x 前缀。
性能与兼容性影响:这些函数抛异常(std::invalid_argument / std::out_of_range),不适合高频解析;嵌入式或性能敏感场景建议手写解析或用 strtol(C 风格,返回错误码)。
-
std::stoi("FF", nullptr, 16)→ 返回255 -
std::stoi("0xFF", nullptr, 0)→ 第三个参数为0表示自动检测前缀(0x→16,0→8,否则→10) - 如果字符串含非法字符(如
"FFG"),解析会在G处停止,返回255并更新idx指针(若传入非空指针) - 超出
int范围时用std::stoul或std::stoull,避免溢出未定义行为
十六进制和位操作的典型配合场景
嵌入式开发、协议解析、权限掩码等场景中,十六进制字面量几乎总是和位运算一起出现,因为每位十六进制数对应 4 个二进制位,直观好算。
容易被忽略的地方:十六进制常量默认是 int 类型,但高位掩码(如 0x80000000)在 32 位系统上可能是负数(符号位为 1),参与移位或逻辑运算时可能触发实现定义行为。
- 推荐用无符号类型明确语义:写成
0x80000000U或0x80000000ULL - 掩码定义常用宏或
constexpr:如constexpr uint32_t FLAG_A = 0x01U;、constexpr uint32_t FLAG_B = 0x02U;,组合用|,测试用& - 避免魔法数字:直接写
0xFF00不如写成(0xFFU ,后者更体现意图且可移植 - 注意字节序:十六进制字面量本身不携带字节序信息,但用于内存拷贝或网络传输时,需额外处理大小端
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











