日期:2025-12-17
标签:C语言, printf, 格式符, 调试技巧, 内存打印
前言printf是 C 入门第一课,但%d、%u、%hx、%hhu这些“长度修饰符”一旦组合起来,很多人就开始晕。
本文用一张表 + 一段代码帮你把常用格式符全部梳理清楚,再也不怕打印错类型导致 UB(未定义行为)。
一、一眼速查表
格式 实际类型 位宽 取值范围 常见用途 典型写法%dsigned int 32 b −2.1 G … +2.1 G 有符号十进制int x; printf("%d\n", x);%uunsigned int 32 b 0 … 4.3 G 无符号十进制unsigned y; printf("%u\n", y);%cchar / int 8 b 0 … 255 输出字符char c='A'; printf("%c\n", c);%hhuunsigned char 8 b 0 … 255 单字节无符号unsigned char b=200; printf("%hhu\n", b);%huunsigned short 16 b 0 … 65 535 半字无符号unsigned short s=50 000; printf("%hu\n", s);%xunsigned int 32 b 0 … 0xFFFFFFFF 32 位十六进制unsigned n; printf("%08x\n", n);%hxunsigned short 16 b 0 … 0xFFFF 16 位十六进制unsigned short s; printf("%04hx\n", s);%hhxunsigned char 8 b 0 … 0xFF 8 位十六进制unsigned char b; printf("%02hhx\n", b);
口诀:“h 短、hh 更短,无修饰就是 int。”
二、长度修饰符到底干嘛?
C 的整型提升规则把char/short先变成int再进栈,
长度修饰符告诉printf“从提升后的 int 里取多少位”:
修饰符 含义hh只取最低 1 字节(unsigned char)h只取最低 2 字节(unsigned short)
无 取 4 字节(unsigned int)l取 8 字节(unsigned long)ll取 8 字节(unsigned long long)z对应size_t(32/64 位自适应)
三、代码实战:内存 dump 模板
#include<stdio.h>intmain(void){unsignedcharbuf[]={0x1A,0x2B,0x3C,0xFD,0xEA};/* 1. 单字节十六进制 */for(size_ti=0;i<sizeof(buf);++i)printf("%02hhx ",buf[i]);/* 1a 2b 3c fd ea */putchar('\n');/* 2. 一次性拼串再打印 */charhex[sizeof(buf)*2+1];for(size_ti=0;i<sizeof(buf);++i)sprintf(hex+i*2,"%02hhX",buf[i]);puts(hex);/* 1A2B3CFDEA */return0;}四、易踩的坑
把
char当%d打印char默认带符号,值0xFF会输出-1;想看到255请用%hhu。%x传unsigned char实参 1 字节,
printf期望 4 字节 → UB;正确写法%02hhx。64 位平台打印
size_t用
%zu,别写%u或%lu。Windows 打印
__int64老 MSVC 用
%I64d/%I64u,而不是%lld。
五、小结
- 看到
hh就想到 1 字节十六进制; - 看到
h就想到 2 字节十六进制; - 其余默认按 4 字节处理。
记住这张表,调试内存、写协议、刷算法题都能秒写格式串!