Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Chuyển đổi Hexadecimal sang Decimal trong C

Hệ cơ số 16 (Hexadecimal)

Hex dùng 16 ký hiệu: 0-9 và A-F (hoặc a-f).

Hex Dec Hex Dec
0-90-9A/a10
B/b11
C/c12
D/d13
E/e14
F/f15

Thuật toán chuyển đổi (Hand calculation)

Ví dụ: A12 (hex) → Decimal


A  1  2
│  │  │
│  │  └─ 2 × 16⁰ = 2 × 1   = 2
│  └──── 1 × 16¹ = 1 × 16  = 16
└────── A(10) × 16² = 10 × 256 = 2560
        ─────────────────────────
        Tổng = 2578

Chương trình C: Hàm chuyển đổi

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int hexToDec(const char *hex) {
    int len = strlen(hex);
    int dec = 0;
    
    // Duyệt từ phải sang trái (chữ số thấp → cao)
    for (int i = len - 1, power = 0; i >= 0; i--, power++) {
        char c = toupper(hex[i]);  // Chấp nhận cả chữ thường
        int val;
        
        if (c >= '0' && c <= '9') {
            val = c - '0';
        } else if (c >= 'A' && c <= 'F') {
            val = c - 'A' + 10;
        } else {
            printf("Ky tu khong hop le: %c\n", c);
            return -1;
        }
        
        dec += val * (int)pow(16, power);
    }
    
    return dec;
}

int main() {
    char hex[100];
    
    printf("Nhap so hex: ");
    scanf("%s", hex);
    
    int dec = hexToDec(hex);
    if (dec != -1) {
        printf("Decimal: %d\n", dec);
        printf("Hex: 0x%X\n", dec);  // In ngược lại dạng hex
    }
    
    return 0;
}

Kết quả


Nhap so hex: A
Decimal: 10
Hex: 0xA

Nhap so hex: A12
Decimal: 2578
Hex: 0xA12

Nhap so hex: ff
Decimal: 255
Hex: 0xFF

Cách 2: Dùng sscanf (Chuẩn thư viện)

#include <stdio.h>

int main() {
    char hex[100];
    unsigned int dec;
    
    printf("Nhap so hex: ");
    scanf("%s", hex);
    
    // %x đọc hex, %X cũng được
    if (sscanf(hex, "%x", &dec) == 1) {
        printf("Decimal: %u\n", dec);
    } else {
        printf("Dinh dang hex khong hop le!\n");
    }
    
    return 0;
}

Cách 3: Duyệt trái sang phải (Hiệu quả hơn)


int hexToDecLeftToRight(const char *hex) {
    int dec = 0;
    for (int i = 0; hex[i]; i++) {
        char c = toupper(hex[i]);
        int val;
        if (c >= '0' && c <= '9') val = c - '0';
        else if (c >= 'A' && c <= 'F') val = c - 'A' + 10;
        else return -1;
        
        dec = dec * 16 + val;  // Dịch trái 1 hex digit = nhân 16
    }
    return dec;
}

Cách này không cần pow(), không cần math.h, nhanh hơn.

Chương trình hoàn chỉnh: Chuyển đổi 2 chiều

#include <stdio.h>
#include <ctype.h>

int hexToDec(const char *hex) {
    int dec = 0;
    for (int i = 0; hex[i]; i++) {
        char c = toupper(hex[i]);
        int val = (c >= '0' && c <= '9') ? c - '0' : c - 'A' + 10;
        if (val < 0 || val > 15) return -1;
        dec = dec * 16 + val;
    }
    return dec;
}

void decToHex(int dec, char *hex) {
    if (dec == 0) { hex[0] = '0'; hex[1] = '\0'; return; }
    char buf[20];
    int i = 0;
    while (dec > 0) {
        int r = dec % 16;
        buf[i++] = (r < 10) ? '0' + r : 'A' + r - 10;
        dec /= 16;
    }
    // Đảo ngược
    for (int j = 0; j < i; j++) hex[j] = buf[i - 1 - j];
    hex[i] = '\0';
}

int main() {
    char hex[20], hex2[20];
    int dec;
    
    printf("Nhap hex: "); scanf("%s", hex);
    dec = hexToDec(hex);
    if (dec >= 0) {
        printf("Dec: %d\n", dec);
        decToHex(dec, hex2);
        printf("Hex lai: %s\n", hex2);
    }
    return 0;
}

Lưu ý

  • Hex thường dùng tiền tố 0x (VD: 0xFF), nhưng nhập không cần
  • Dùng unsigned cho số hex lớn (tránh dấu âm)
  • printf("%X", n) in hex in hoa, %x in thường
  • Kiểm tra input hợp lệ (chỉ 0-9, A-F, a-f)