大多數情況確實用十進制**(因為人類習慣),但特定場景下**十六進制、二進制、八進制更優**,選擇進制的本質是:**信息密度與認知負荷的平衡**。
| 場景 | 推薦進制 | 理由 | 例子 |
|---|---|---|---|
| 業務邏輯數值(金額、數量、年齡) | 十進制 | 人類自然計數,溝通零成本 | price = 199.99 |
| 位操作、標誌位、掩碼 | 十六進制 | 1 hex = 4 bits,直接對應二進制位模式 | flags = 0x0F; mask = 0xFF00 |
| 字節數據、內存地址、顏色值 | 十六進制 | 2 hex = 1 byte,一眼看清字節邊界 | color = 0xFF8000; addr = 0x7FFF_1234 |
| 文件權限、Unix 模式 | 八進制 | 3 bits = 1 oct,rwx 權限組完美映射 | chmod 0755; mode = 0644 |
| 嵌入式寄存器配置 | 十六進制/二進制 | 數據手冊用 hex,逐位配置用 binary | REG = 0x80; // 1000_0000b |
| 網絡協議端口、協議號 | 十進制/十六進制並用 | 知名端口十進制易記,分析封包用 hex | port = 80 (0x0050) |
// 十進制 529
int val = 529; // 你能秒懂這是哪兩個字節嗎?
// 十六進制 0x0211
int val = 0x0211; // 一眼看出:高字節 0x02,低字節 0x11
// 內存佈局(小端序):11 02
// 位模式:0000_0010 0001_0001
十六進制**保留了字節邊界信息**,十進制將其「混淆」為單一數值,導致位級操作時認知負荷劇增。
// C# / Java / JavaScript / Python / Rust / Go 等
int dec = 100; // 十進制
int hex = 0xFF; // 十六進制
int bin = 0b1100100; // 二進制 (C++14, Java 7, C# 7, Python 3.6+)
int oct = 0o144; // 八進制 (現代語言統一 0o 前綴)
int hex_with_sep = 0xFF_FF_FF_FF; // 數字分隔符增強可讀性
printf("0x%08X", val) 統一十六進制,便於位模式分析不統一用十進制,是因為**計算機內部是二進制**,十六進制是二進制的**無損壓縮表示**(4:1),完美保留位結構;八進制歷史原因用於 Unix 權限(3:1)。**用對進制,能讓代碼自己解釋自己**——看到 0xFF00 就知是高字節掩碼,看到 0755 就知是 rwxr-xr-x,這才是工程師的浪漫。