首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言進制轉換完全指南:二/八/十/十六進制互轉算法與代碼實現

     編輯:關於C語言

C語言進制轉換完全指南:二/八/十/十六進制互轉算法與代碼實現

進制轉換是計算機基礎核心技能,也是C語言處理底層數據、位運算、網絡協議、嵌入式寄存器操作的必備功夫。本文系統梳理四大進制(二/八/十/十六)互轉的數學原理、手算方法、C語言標準庫支持及自定義實現代碼。

進制表示法速查

進制數字集合C語言字面量前綴示例
二進制0,1無標準前綴(C++14 0b,GCC擴展支持)0b1010 (GCC)
八進制0-70012 = 十進制10
十進制0-9無(非0開頭)10
十六進制0-9,A-F0x 或 0X0xA = 十進制10

核心轉換算法(數學原理)

1. 十進制 → 其他進制(除基取余法)

  • 原理:連續除以目標基數,余數逆序排列
  • 十進制→二進制:除2取余,余數逆序
  • 十進制→八進制:除8取余,余數逆序
  • 十進制→十六進制:除16取余,余數逆序(10-15用A-F)
例:十進制 13 → 二進制
13 ÷ 2 = 6 余 1
 6 ÷ 2 = 3 余 0
 3 ÷ 2 = 1 余 1
 1 ÷ 2 = 0 余 1
逆序:1101

2. 其他進制 → 十進制(按權展開求和)

  • 原理:各位數字 × 基數^位權 累加
  • 二進制→十進制:1101 = 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 13
  • 八進制→十進制:12 = 1×8¹ + 2×8⁰ = 10
  • 十六進制→十進制:0xA = 10×16⁰ = 10

3. 二進制 ↔ 八進制(三位一組法)

  • 原理:2³=8,每3位二進制對應1位八進制
  • 二→八:從右向左每3位分組,不足左補0,查表轉換
  • 八→二:每位八進制展開為3位二進制,高位組補0
二進制 101101 → 分組 101 101 → 八進制 55
八進制 55 → 展開 101 101 → 二進制 101101

4. 二進制 ↔ 十六進制(四位一組法)

  • 原理:2⁴=16,每4位二進制對應1位十六進制
  • 二→十六:從右向左每4位分組,不足左補0
  • 十六→二:每位十六進制展開為4位二進制
二進制 10110110 → 分組 1011 0110 → 十六進制 0xB6
十六進制 0xB6 → 展開 1011 0110 → 二進制 10110110

5. 八進制 ↔ 十六進制(以二進制為中介)

  • 八→二→十六,或 十六→二→八
  • 無直接對應關係(8非16冪次,16非8冪次)

C語言標準庫支持

#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';
}

負數表示:補碼制

  • C語言有符號整數採用二補碼表示
  • -1 在 32 位系統中:0xFFFFFFFF(全1)
  • printf("%x", -1) 輸出 ffffffff
  • 右移 >>:算術右移(符號位擴展)vs 邏輯右移(高位補0),C標準規定實現定義,主流編譯器均為算術右移

總結

進制轉換核心就三個模型:除基取余(十→他)、按權展開(他→十)、分組查表(二↔八/十六)。C語言提供 printf/scanf 格式化、strtol 解析、sprintf 生成等標準工具,工程中優先使用標準庫;理解底層原理有助於調試位操作、協議解析、寄存器配置等底層任務。建議熟練掌握 0-15 對應的二/八/十/十六進制對照表,實現「看到 0xA 直覺反應 1010、12、10」的肌肉記憶。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved