進制轉換是計算機基礎核心技能,也是C語言處理底層數據、位運算、網絡協議、嵌入式寄存器操作的必備功夫。本文系統梳理四大進制(二/八/十/十六)互轉的數學原理、手算方法、C語言標準庫支持及自定義實現代碼。
| 進制 | 數字集合 | C語言字面量前綴 | 示例 |
|---|---|---|---|
| 二進制 | 0,1 | 無標準前綴(C++14 0b,GCC擴展支持) | 0b1010 (GCC) |
| 八進制 | 0-7 | 0 | 012 = 十進制10 |
| 十進制 | 0-9 | 無(非0開頭) | 10 |
| 十六進制 | 0-9,A-F | 0x 或 0X | 0xA = 十進制10 |
例:十進制 13 → 二進制 13 ÷ 2 = 6 余 1 6 ÷ 2 = 3 余 0 3 ÷ 2 = 1 余 1 1 ÷ 2 = 0 余 1 逆序:1101
1101 = 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 1312 = 1×8¹ + 2×8⁰ = 100xA = 10×16⁰ = 10二進制 101101 → 分組 101 101 → 八進制 55 八進制 55 → 展開 101 101 → 二進制 101101
二進制 10110110 → 分組 1011 0110 → 十六進制 0xB6 十六進制 0xB6 → 展開 1011 0110 → 二進制 10110110
#include <stdio.h>
#include <stdlib.h>
// 輸出格式化
printf("%d", 10); // 十進制
printf("%o", 10); // 八進制 → 12
printf("%x", 10); // 十六進制小寫 → a
printf("%X", 10); // 十六進制大寫 → A
printf("%#o", 10); // 帶前綴 0 → 012
printf("%#x", 10); // 帶前綴 0x → 0xa
// 字符串解析(字符串→整數)
int i = strtol("1010", NULL, 2); // 二進制字符串 → 10
int i = strtol("12", NULL, 8); // 八進制字符串 → 10
int i = strtol("A", NULL, 16); // 十六進制字符串 → 10
int i = strtol("0xA", NULL, 0); // 基數0:自動識別前綴
// itoa 非標準,常用 sprintf
char buf[33];
sprintf(buf, "%d", 10); // "10"
sprintf(buf, "%o", 10); // "12"
sprintf(buf, "%x", 10); // "a"
sprintf(buf, "%X", 10); // "A"
// 任意進制字符串 → long
long strToLong(const char* str, int base) {
long val = 0;
while (*str) {
int digit = 0;
if (*str >= '0' && *str <= '9') digit = *str - '0';
else if (*str >= 'A' && *str <= 'Z') digit = *str - 'A' + 10;
else if (*str >= 'a' && *str <= 'z') digit = *str - 'a' + 10;
else break;
if (digit >= base) break;
val = val * base + digit;
str++;
}
return val;
}
// long → 任意進制字符串(基數 2-36)
void longToStr(long val, int base, char* buf) {
const char* digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char tmp[65];
int i = 0, neg = 0;
if (val < 0 && base == 10) { neg = 1; val = -val; }
if (val == 0) { buf[0] = '0'; buf[1] = '\0'; return; }
while (val > 0) {
tmp[i++] = digits[val % base];
val /= base;
}
if (neg) buf[0] = '-';
for (int j = 0; j < i; j++) buf[neg + j] = tmp[i - 1 - j];
buf[neg + i] = '\0';
}
-1 在 32 位系統中:0xFFFFFFFF(全1)printf("%x", -1) 輸出 ffffffff>>:算術右移(符號位擴展)vs 邏輯右移(高位補0),C標準規定實現定義,主流編譯器均為算術右移進制轉換核心就三個模型:除基取余(十→他)、按權展開(他→十)、分組查表(二↔八/十六)。C語言提供 printf/scanf 格式化、strtol 解析、sprintf 生成等標準工具,工程中優先使用標準庫;理解底層原理有助於調試位操作、協議解析、寄存器配置等底層任務。建議熟練掌握 0-15 對應的二/八/十/十六進制對照表,實現「看到 0xA 直覺反應 1010、12、10」的肌肉記憶。