C 语言实例 – 二进制与十进制相互转换(完整指南)

C 语言实例 – 二进制与十进制相互转换

你有没有想过,计算机是如何“读懂”我们输入的数字的?比如我们输入数字 10,计算机却用 1010 这样的形式来存储它。这种“翻译”过程,正是二进制与十进制之间的相互转换。作为 C 语言学习者,掌握这一基础技能,不仅有助于理解底层数据存储机制,还能在嵌入式开发、位运算、网络协议等领域大展身手。

今天,我们就通过几个典型的 C 语言实例,手把手带你实现二进制与十进制之间的相互转换。无论你是编程初学者,还是已经接触过 C 语言的中级开发者,相信都能从中获得启发。


为什么需要二进制与十进制转换?

在计算机世界里,所有数据都以二进制形式存在——0 和 1。我们日常使用的十进制(0~9)只是人类的习惯。举个形象的例子:就像我们用“公斤”来衡量重量,而计算机却用“克”一样,两者本质相同,只是表达方式不同。

二进制的每一位代表 2 的幂次:

  • 第 0 位(最右):2⁰ = 1
  • 第 1 位:2¹ = 2
  • 第 2 位:2² = 4
  • 第 3 位:2³ = 8
    以此类推。

所以,十进制数 10 转换为二进制的过程就是:
10 = 8 + 2 = 2³ + 2¹ → 二进制表示为 1010。

反过来,二进制 1010 转换为十进制:
1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 8 + 0 + 2 + 0 = 10。

这个过程虽然简单,但用 C 语言实现,却能锻炼你的逻辑思维和编程能力。


十进制转二进制:算法解析与代码实现

我们先从十进制转二进制开始。核心思想是“除以 2 取余”,直到商为 0。

举个例子:十进制数 13 转二进制
13 ÷ 2 = 6 余 1
6 ÷ 2 = 3 余 0
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1
将余数从下往上排列:1101 → 二进制结果

这个算法可以用 C 语言轻松实现。

#include <stdio.h>

// 函数:将十进制整数转换为二进制字符串
void decimalToBinary(int n) {
    // 如果输入为 0,直接输出 0
    if (n == 0) {
        printf("0\n");
        return;
    }

    // 用于存储二进制位的数组,最多 32 位(int 类型)
    int binary[32];
    int i = 0;  // 用于记录当前存储位置

    // 循环:每次除以 2,记录余数
    while (n > 0) {
        binary[i] = n % 2;  // 余数是当前位的二进制值
        n = n / 2;          // 商作为下一次除法的被除数
        i++;                // 指针后移
    }

    // 从最后一个余数开始输出,即倒序打印
    printf("二进制表示为:");
    for (int j = i - 1; j >= 0; j--) {
        printf("%d", binary[j]);
    }
    printf("\n");
}

int main() {
    int num;

    printf("请输入一个十进制整数:");
    scanf("%d", &num);

    decimalToBinary(num);

    return 0;
}

代码说明

  • binary[32]:数组大小设定为 32,因为 int 类型通常占 32 位,能覆盖所有情况。
  • n % 2:取余操作,得到当前最低位的二进制值(0 或 1)。
  • n / 2:整数除法,相当于右移一位。
  • 最后循环倒序输出,因为余数是从低位到高位记录的。

二进制转十进制:位权相加法详解

反过来,把二进制转十进制,核心是“按权展开”。每一位的值乘以对应的 2 的幂次,然后相加。

例如:二进制 1101
= 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1 = 13

在 C 语言中,我们可以用字符串形式输入二进制,然后逐位处理。

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

// 函数:将二进制字符串转换为十进制整数
int binaryToDecimal(char *binaryStr) {
    int decimal = 0;
    int len = strlen(binaryStr);  // 获取字符串长度

    // 从左到右遍历每一位(高位在前)
    for (int i = 0; i < len; i++) {
        // 检查是否为有效的二进制字符
        if (binaryStr[i] != '0' && binaryStr[i] != '1') {
            printf("错误:输入包含非二进制字符!\n");
            return -1;
        }

        // 当前位的值(0 或 1)
        int bit = binaryStr[i] - '0';  // 字符 '0' 转为整数 0,'1' 转为 1

        // 权值:从高位开始,指数为 (len - 1 - i)
        int power = len - 1 - i;

        // 累加:bit × 2^power
        decimal += bit * (int)pow(2, power);
    }

    return decimal;
}

int main() {
    char binary[33];  // 最多 32 位 + 结束符 \0

    printf("请输入一个二进制数(最多 32 位):");
    scanf("%s", binary);

    int result = binaryToDecimal(binary);

    if (result != -1) {
        printf("十进制结果为:%d\n", result);
    }

    return 0;
}

代码说明

  • strlen(binaryStr):获取字符串长度,用于计算每一位的权重。
  • binaryStr[i] - '0':这是将字符 '0'/'1' 转为整数 0/1 的常用技巧。
  • pow(2, power):计算 2 的幂次,注意返回类型为 double,需强制转换为 int。
  • 错误处理:检测输入是否包含非法字符,增强程序健壮性。

实际案例:模拟计算器功能

我们来做一个小工具,让用户在十进制和二进制之间自由切换。这不仅能巩固知识,还能提升代码组织能力。

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

// 十进制转二进制
void decimalToBinary(int n) {
    if (n == 0) {
        printf("0\n");
        return;
    }

    int binary[32];
    int i = 0;

    while (n > 0) {
        binary[i++] = n % 2;
        n /= 2;
    }

    printf("二进制:");
    for (int j = i - 1; j >= 0; j--) {
        printf("%d", binary[j]);
    }
    printf("\n");
}

// 二进制转十进制
int binaryToDecimal(char *bin) {
    int len = strlen(bin);
    int decimal = 0;

    for (int i = 0; i < len; i++) {
        if (bin[i] != '0' && bin[i] != '1') {
            return -1;
        }
        int bit = bin[i] - '0';
        int power = len - 1 - i;
        decimal += bit * (int)pow(2, power);
    }

    return decimal;
}

int main() {
    int choice;
    char binary[33];

    printf("=== 二进制与十进制转换工具 ===\n");
    printf("1. 十进制转二进制\n");
    printf("2. 二进制转十进制\n");
    printf("请选择功能 (1 或 2):");
    scanf("%d", &choice);

    switch (choice) {
        case 1: {
            int num;
            printf("请输入十进制数:");
            scanf("%d", &num);
            decimalToBinary(num);
            break;
        }
        case 2: {
            printf("请输入二进制数(最多 32 位):");
            scanf("%s", binary);
            int result = binaryToDecimal(binary);
            if (result != -1) {
                printf("十进制结果:%d\n", result);
            }
            break;
        }
        default:
            printf("无效选择!\n");
    }

    return 0;
}

💡 使用建议

  • 编译命令:gcc converter.c -o converter
  • 运行:./converter
  • 输入测试:10 → 二进制 1010;1010 → 十进制 10

常见问题与调试技巧

在实现过程中,初学者常遇到以下问题:

问题 原因 解决方案
输出二进制顺序错误 余数从低位开始存储,未倒序输出 使用循环从数组末尾开始打印
二进制字符串无法识别 未做字符合法性检查 增加 if (c != '0' && c != '1') 判断
pow(2, n) 返回小数 pow 返回 double,需强制转换 (int)pow(2, power)
数组越界 输入过长的二进制数 限制字符串长度为 32

总结与进阶建议

通过这篇 C 语言实例 – 二进制与十进制相互转换的教程,你已经掌握了:

  • 十进制转二进制的“除 2 取余”算法
  • 二进制转十进制的“按权展开”方法
  • 如何用数组存储中间结果
  • 如何处理输入验证与边界情况

这些技能不仅是面试常考题,更是理解位运算、数据结构和底层原理的基础。建议你:

  • 尝试将程序改为支持负数(使用补码思想)
  • 添加十六进制转换功能
  • 将代码封装为库函数,提高复用性

编程的本质,就是把抽象的逻辑变成可运行的代码。每一次转换,都是你对计算机世界的又一次“翻译”。希望今天的实践,能让你在 C 语言的学习之路上,走得更稳、更远。