C语言实现常见进制转换的完整代码示例

苏见山
苏见山
发布时间:2026-10-15 | 3人浏览过
原创

本文深入解析C语言中的进制转换逻辑,涵盖十进制至二进制、八进制、十六进制的正转换方法,以及低位制至十进制的逆向计算。通过除基取余法与权重累加法原理,结合具体代码案例,实现通用且准确的数值格式转换。

结果与目标

C语言标准库未直接提供将非十进制整数直接打印为其他进制字符串的格式化选项(如 %b 或 %o 在部分旧编译器支持,但 %x 才是十六进制标准)。因此,掌握底层算法对于处理输入输出、协议解析及嵌入式开发至关重要。本篇聚焦于通过手动实现的算法完成以下四类核心转换:

  1. 正向转换:十进制整数 → 二进制 / 八进制 / 十六进制。
  2. 反向转换:二进制 / 八进制 / 十六进制 → 十进制整数。

准备条件

  • 编译环境:支持 C89/C90 标准的编译器(如 GCC, Clang)。
  • 依赖头文件:<stdio.h>, <math.h> (用于 pow 函数), <string.h> (字符串长度处理)。
  • 数据类型:根据转换范围选择合适的整型变量。示例代码中使用 int,若涉及超大数值建议替换为 long long。

真实操作顺序

第1步:十进制转换为二进制或八进制

目的:将用户输入的十进制整数转化为任意2~8进制数。
原理:采用“除基取余,逆序排列”法。不断用目标进制的基数去除当前商,记录余数,直到商为0。最后一次除法得到的余数是最高位,第一次是最低位。

操作要点:

  • 使用数组临时存储余数序列。
  • 注意输出时需从数组末尾向前遍历。
#include <stdio.h>

int main()
{
    int x, n;
    // x: 待转换的十进制数, n: 目标进制 (2-9)
    scanf("%d %d", &x, &n);

    int arr[100] = { 0 }; // 足够大的数组存放余数
    int i = 0; // 记录余数个数
    
    // 循环执行除基取余
    while (x)
    {
        arr[i++] = x % n; // 存入余数
        x /= n;           // 更新商
    }
    
    // 逆序输出即为正确结果
    for (j = i - 1; j >= 0; j--)
    {
        printf("%d", arr[j]);
    }
    printf("\n");
    return 0;
}

第2步:十进制转换为十六进制

目的:处理包含 A-F 字符表示的16进制数。
差异点:余数 10~15 需映射为字符 'A'~'F'。

操作步骤:

  1. 定义 char 类型数组以兼容字符存储。
  2. 执行同样的除16取余循环。
  3. 对每个余数进行条件判断转换:
  • 余数 < 10:加上字符 '0' (ASCII 48) 转为数字字符。
  • 余数 ≥ 10:映射为对应大写英文字母。
#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);
    
    char arr[100] = { 0 };
    int i = 0;
    
    while (x)
    {
        arr[i++] = x % 16; // 暂存原始余数值 (0-15)
        x /= 16;
    }
    
    // 处理字符映射
    for (j = 0; j < i; j++)
    {
        switch (arr[j])
        {
        case 10: arr[j] = 'A'; break;
        case 11: arr[j] = 'B'; break;
        case 12: arr[j] = 'C'; break;
        case 13: arr[j] = 'D'; break;
        case 14: arr[j] = 'E'; break;
        case 15: arr[j] = 'F'; break;
        default: arr[j] += 48; // 转换为 ASCII 字符 '0'-'9'
        }
    }
    
    // 逆序打印结果
    for (j = i - 1; j >= 0; j--)
    {
        printf("%c", arr[j]);
    }
    printf("\n");
    return 0;
}

第3步:二进制/八进制转换为十进制

目的:识别以十进制形式录入的二进制串或八进制串,并还原其十进制值。
注意:此处假设输入被当作普通整数读取(例如输入 101 代表二进制5)。若输入包含字母或前缀,需先按字符串解析。

原理:按权展开求和。取出每一位数字,乘以基数的相应次幂,累加得到结果。

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

int main()
{
    int n = 0, sum = 0, i = 0, x = 0;
    // x: 源数值(看似十进制实为二进制/八进制), n: 实际进制基数
    scanf("%d %d", &x, &n);
    
    while (x)
    {
        // x%10 提取最低位数字
        // pow(n, i) 计算该位的权重
        sum += (x % 10) * pow(n, i++);
        x /= 10; // 移除已处理位
    }
    
    printf("%d\n", sum);
    return 0;
}

第4步:十六进制字符串转换为十进制

目的:处理含字母 A-F 的十六进制输入。
策略:由于含有字母,必须使用 scanf("%s") 读取为字符串,逐字符解析。

步骤:

  1. 获取字符串长度 len。
  2. 遍历字符串,将字符转换为数值(0-15)。
  3. 依据位置计算权重:16^(len-i-1)。
  4. 累加求和。
#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
    char arr1[100] = { 0 };
    scanf("%s", arr1);
    
    int len = strlen(arr1);
    int sum = 0;
    
    for (int i = 0; i < len; i++)
    {
        int temp = 0;
        // 字符转数字
        switch (arr1[i])
        {
        case 'A': case 'a': temp = 10; break;
        case 'B': case 'b': temp = 11; break;
        case 'C': case 'c': temp = 12; break;
        case 'D': case 'd': temp = 13; break;
        case 'E': case 'e': temp = 14; break;
        case 'F': case 'f': temp = 15; break;
        default: temp = arr1[i] - '0'; break; // 数字字符转数值
        }
        
        // 累加:数值 × 权重
        sum += temp * pow(16, len - i - 1);
    }
    
    printf("%d\n", sum);
    return 0;
}

原文有依据的排错

  • 浮点数精度警告:上述代码使用了 math.h 中的 pow 函数。在严格的嵌入式或高性能场景中,浮点运算可能带来微小误差或性能开销。若追求绝对精确,可将幂运算改写为整型乘法累积,或使用位左移(仅针对2的幂次)代替。
  • 输入合法性:本示例代码未加入输入校验(如负数处理、非法字符检测)。在实际生产环境中,应对用户输入进行严格的前置检查。

简要总结

C语言的进制转换核心在于理解“位权”概念与“除基取余”算法。正向转换依赖于逆序收集余数,反向转换依赖于按位加权累加。掌握这些基础逻辑不仅有助于解决编程题,更是理解计算机数据存储结构的基石。以上就是C语言实现常见进制转换的详细内容,更多关于C语言数值处理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表