初學者常見疑問:%0x 和 %x 輸出十六進制有何不同?核心在於 標志字符 '0' 的最小寬度零填充作用。
%[標志][最小寬度][.精度][長度修飾]類型
- 左對齊、+ 強制符號、空格 正數前加空格、# 替代形式、0 零填充x/X 十六進制、d/i 有符號十進制、u 無符號十進制、o 八進制
#include <stdio.h>
int main() {
int val = 0xAB; // 171
printf("val = %x\n", val); // 輸出: ab
printf("val = %0x\n", val); // 輸出: ab (無最小寬度,0 標志無效果)
printf("val = %4x\n", val); // 輸出: " ab" (寬度 4,默認空格填充)
printf("val = %04x\n", val); // 輸出: "00ab" (寬度 4,0 填充) ← 關鍵區別
printf("val = %#x\n", val); // 輸出: 0xab (# 標志添加 0x 前綴)
printf("val = %#06x\n", val); // 輸出: 0x00ab (寬度含 0x,共 6 字符)
return 0;
}
%0x 等同於 %x:單獨的 '0' 標志無最小寬度時無任何效果。%04x、%08X。%04x 輸出寬度至少 4 字符,高位不足補 '0';%4x 補空格。# 標志:%#06x → 0x00ab(寬度 6 包含 0x)。printf("0x%08X\n", ptr); → 0x00401000printf("Color: #%06X\n", rgb); → Color: #FF00AAprintf("%02X ", buf[i]); → 48 65 6C 6C 6F
printf("%05d\n", 42); // 00042 (有符號整數)
printf("%010u\n", 123); // 0000000123 (無符號整數)
printf("%08o\n", 0755); // 00000755 (八進制)
printf("%04f\n", 3.14); // 3.140000 (浮點數寬度含小數點,精度另控)
%0x 本身無特殊含義,零填充的核心是 '0' 標志 + 最小寬度。掌握 %04x、%08X、%#06x 等組合,能精確控制十六進制輸出格式,是調試內存、協議、硬件寄存器的必備技能。