2026/2/21 1:32:30
网站建设
项目流程
宝塔面板做网站,wordpress进的慢,长沙优化官网服务,福州网站建设推广平台日期#xff1a;2025-12-17
标签#xff1a;C语言, printf, 格式符, 调试技巧, 内存打印前言
printf 是 C 入门第一课#xff0c;但 %d、%u、%hx、%hhu 这些“长度修饰符”一旦组合起来#xff0c;很多人就开始晕。
本文用一张表 一段代码帮你把常用格式符全部梳理清楚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 cA; printf(%c\n, c);%hhuunsigned char 8 b 0 … 255 单字节无符号unsigned char b200; printf(%hhu\n, b);%huunsigned short 16 b 0 … 65 535 半字无符号unsigned short s50 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 charh只取最低 2 字节unsigned short无 取 4 字节unsigned intl取 8 字节unsigned longll取 8 字节unsigned long longz对应size_t32/64 位自适应三、代码实战内存 dump 模板#includestdio.hintmain(void){unsignedcharbuf[]{0x1A,0x2B,0x3C,0xFD,0xEA};/* 1. 单字节十六进制 */for(size_ti0;isizeof(buf);i)printf(%02hhx ,buf[i]);/* 1a 2b 3c fd ea */putchar(\n);/* 2. 一次性拼串再打印 */charhex[sizeof(buf)*21];for(size_ti0;isizeof(buf);i)sprintf(hexi*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 字节处理。记住这张表调试内存、写协议、刷算法题都能秒写格式串