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

C 語言實作十六進制轉十進制完整指南

     編輯:關於C語言

轉換原理

十六進制為基數 16,數字 0-9 表 0-9,A-F(或 a-f)表 10-15。第 N 位(從 0 起)權值為 16^N。
例:2AF5 = 2×16³ + 10×16² + 15×16¹ + 5×16⁰ = 8192+2560+240+5 = 10997。

程式架構

  1. 冪次計算:power(16, exp) 回傳 16^exp。
  2. 單字元轉值:'0'-'9' → 0-9,'a'-'f'/'A'-'F' → 10-15,其餘回傳 -1。
  3. 主轉換函式:從字串最低位(最右)向左掃描,累加 值 × 權值。

完整程式碼(含命令列參數支援)

/* hex2int.c - 十六進制轉十進制 */
#include <stdio.h>
#include <string.h>

#define MB 0x0100000UL  // 1 MB 常數示範

unsigned long power(int base, int exp);
int to_lower(int c);
unsigned long htoi(const char *s);

int main(int argc, char *argv[]) {
    if (argc > 1) {
        printf("long integer: %lu\n", htoi(argv[1]));
    }
    printf("M/Byte: %lu\n", MB);
    return 0;
}

unsigned long htoi(const char *s) {
    int len = strlen(s);
    unsigned long result = 0;
    int pos = 0; // 16^pos
    for (int i = len - 1; i >= 0; --i) {
        char ch = to_lower(s[i]);
        int val;
        if (ch >= '0' && ch <= '9') val = ch - '0';
        else if (ch >= 'a' && ch <= 'f') val = ch - 'a' + 10;
        else continue; // 忽略非法字元(如 "0x" 前綴)
        unsigned long p = power(16, pos++);
        result += p * val;
    }
    return result;
}

unsigned long power(int base, int exp) {
    unsigned long res = 1;
    while (exp--) res *= base;
    return res;
}

int to_lower(int c) {
    return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c;
}

關鍵細節

  • 大小寫不敏感:to_lower 統一轉小寫再判斷。
  • 忽略非法字元:遇非 0-9、a-f 直接跳過,可直接處理 "0x2AF5" 等帶前綴字串。
  • 無符號長整數:unsigned long 可表示至 4,294,967,295(32 位),足夠 8 位十六進制(FFFFFFFF)。
  • 編譯提示:GCC/Clang 需連結數學庫嗎?不需,純整數運算。

標準庫替代方案

實際專案建議直接用 strtoul(s, NULL, 16)(<stdlib.h>),自動處理前綴、溢位、錯誤碼,且經過高度優化。

#include <stdlib.h>
unsigned long val = strtoul("2AF5", NULL, 16); // 10997

擴展:十進制轉十六進制字串

void itoh(unsigned long val, char *buf) {
    const char *hex = "0123456789ABCDEF";
    char tmp[16]; int i = 0;
    if (val == 0) { buf[0]='0'; buf[1]='\0'; return; }
    while (val) { tmp[i++] = hex[val & 0xF]; val >>= 4; }
    for (int j=0; j
							
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved