从零开始:C语言实现十进制与二进制互转(超详细教程+源码)
** 无论你是编程新手还是需要复习,这篇文章都将彻底搞懂计算机底层的数字秘密!

(Meta Description)
本文是C语言学习者的必看指南!我们将深入浅出地讲解十进制与二进制之间的转换原理,并提供完整、可运行的C语言代码示例,从理论到实践,手把手教你实现dec2bin和bin2dec函数,让你轻松掌握计算机数据表示的核心技能。
引言:为什么我们要学习十进制与二进制的转换?
作为一名程序员,我们每天都在与计算机打交道,但你有没有想过,我们日常使用的数字(如10, 255, 1024)在计算机内部是如何表示的?答案就是二进制。
计算机的CPU只认识两种状态:高电平(1)和低电平(0),所有的数据,包括数字、字符、图片、声音,最终都必须转换为二进制序列才能被处理和理解。
虽然我们不必每天都手动进行转换,但理解这个过程至关重要:

- 夯实编程基础: 它是理解数据类型(如
int,char)、位运算、内存布局等高级概念的前提。 - 解决实际问题: 在网络编程(如IP地址、子网掩码)、嵌入式开发、加密算法等领域,二进制操作是家常便饭。
- 提升面试竞争力: 这是面试中几乎必问的经典问题,考察你的计算机基础是否扎实。
我们就用最经典的C语言,来亲手实现十进制和二进制之间的转换。
核心理论:转换的“魔法”规则
在敲代码之前,我们必须搞懂背后的数学原理,这就像学武功要先扎马步一样。
1 十进制转二进制(除2取余法)
这是我们最熟悉的进制,基数为10,每一位的权值是10的幂次方(..., 10³, 10², 10¹, 10⁰)。
要将一个十进制整数转换为二进制,规则很简单:“除2取余,逆序排列”。

步骤:
- 将十进制数除以2,记录下余数(0或1)。
- 将商作为新的十进制数,重复第一步,直到商为0。
- 将所有得到的余数从下往上(逆序)排列,就是对应的二进制数。
举个例子:将十进制 13 转换为二进制
| 步骤 | 计算过程 | 商 | 余数 |
|---|---|---|---|
| 1 | 13 ÷ 2 | 6 | 1 |
| 2 | 6 ÷ 2 | 3 | 0 |
| 3 | 3 ÷ 2 | 1 | 1 |
| 4 | 1 ÷ 2 | 0 | 1 |
当商为0时停止,将余数从下往上排列:1101。
十进制的 13 等于二进制的 1101。
2 二进制转十进制(按权相加法)
反过来,如果我们有一个二进制数,如何转换回十进制呢?规则是:“按权相加”。
步骤:
- 从二进制数的最右边(最低位)开始,每一位的权值是2的相应幂次方(2⁰, 2¹, 2², ...)。
- 将每一位的值(0或1)乘以其对应的权值。
- 将所有结果相加,得到的总和就是十进制数。
举个例子:将二进制 1101 转换为十进制
1 1 0 1 <-- 二进制数
↓ ↓ ↓ ↓
2³ 2² 2¹ 2⁰ <-- 权值
= (1 * 2³) + (1 * 2²) + (0 * 2¹) + (1 * 2⁰)
= (1 * 8) + (1 * 4) + (0 * 2) + (1 * 1)
= 8 + 4 + 0 + 1
= 13
二进制的 1101 等于十进制的 13。
C语言实战:代码实现
理论已经掌握,现在让我们把它变成可运行的C语言代码,我们将创建两个函数:decimalToBinary 和 binaryToDecimal。
1 十进制转二进制函数
这个函数的核心思想是模拟“除2取余法”,并将余数存储起来,因为我们是“逆序排列”,所以使用一个数组来存储余数,最后再反向输出。
#include <stdio.h>
#include <math.h> // 用于 pow 函数(可选)
// 函数声明
void decimalToBinary(int decimalNum);
int main() {
int num;
printf("请输入一个十进制整数: ");
scanf("%d", &num);
printf("十进制 %d 对应的二进制是: ", num);
decimalToBinary(num);
return 0;
}
/**
* @brief 将十进制整数转换为二进制并打印
* @param decimalNum 要转换的十进制整数
*/
void decimalToBinary(int decimalNum) {
// 处理0的特殊情况
if (decimalNum == 0) {
printf("0");
return;
}
// 计算二进制所需的位数(以确定数组大小)
// log2(x) + 1 是计算一个数二进制位数的方法
int bits = (int)(log2(decimalNum)) + 1;
int binaryNum[bits]; // 创建数组存储二进制位
int index = 0;
// 核心:除2取余法
while (decimalNum > 0) {
binaryNum[index++] = decimalNum % 2; // 存储余数
decimalNum = decimalNum / 2; // 更新商
}
// 逆序打印数组
for (int i = index - 1; i >= 0; i--) {
printf("%d", binaryNum[i]);
}
printf("\n");
}
代码解析:
#include <math.h>: 引入数学库,我们用log2函数来快速计算一个数的二进制位数,这样能创建一个大小刚刚好的数组,避免浪费空间。decimalToBinary函数:- 首先处理
0的特殊情况,因为log2(0)是未定义的。 - 使用
log2(decimalNum) + 1计算出二进制所需的位数bits。 - 创建一个
int数组binaryNum来存储每一位的余数。 while循环不断执行decimalNum % 2和decimalNum / 2,直到decimalNum为0。- 通过一个
for循环从后往前遍历binaryNum数组,打印出结果。
- 首先处理
2 二进制转十进制函数
这个函数相对简单,我们只需要遍历二进制数的每一位,然后按照“按权相加”的规则计算即可。
#include <stdio.h>
#include <string.h> // 用于 strlen 函数
// 函数声明
int binaryToDecimal(const char *binaryStr);
int main() {
char binaryString[32]; // 假设二进制数不超过32位
printf("请输入一个二进制数: ");
scanf("%s", binaryString);
// 简单的输入验证(可选,但推荐)
for (int i = 0; binaryString[i] != '\0'; i++) {
if (binaryString[i] != '0' && binaryString[i] != '1') {
printf("错误:输入的不是有效的二进制数,\n");
return 1; // 非正常退出
}
}
int decimalNum = binaryToDecimal(binaryString);
printf("二进制 %s 对应的十进制是: %d\n", binaryString, decimalNum);
return 0;
}
/**
* @brief 将二进制字符串转换为十进制整数
* @param binaryStr 二进制字符串("1101")
* @return 转换后的十进制整数
*/
int binaryToDecimal(const char *binaryStr) {
int decimalNum = 0;
int length = strlen(binaryStr);
int power = length - 1; // 初始幂次为最高位
// 遍历二进制字符串的每一位
for (int i = 0; i < length; i++) {
// 将字符 '0' 或 '1' 转换为整数 0 或 1
int bit = binaryStr[i] - '0';
// 按权相加
decimalNum += bit * (int)pow(2, power);
// 更新幂次
power--;
}
return decimalNum;
}
代码解析:
- 输入为字符串: 在C语言中,处理“一串数字”最方便的方式是使用字符数组(即字符串)。
- 输入验证: 这是一个好习惯,我们检查输入的字符串是否只包含
'0'和'1',如果不是,则报错退出。 binaryToDecimal函数:strlen(binaryStr)获取字符串的长度。power变量记录当前位的权值(2的幂次),从length-1开始。for循环遍历字符串的每一个字符。bit = binaryStr[i] - '0'是一个巧妙的技巧,在ASCII码中,'0'的值是48,'1'的值是49,所以'1' - '0'的结果就是1,'0' - '0'的结果就是0。decimalNum += bit * (int)pow(2, power);实现了按权相加的核心逻辑。- 循环结束后,
decimalNum中存储的就是最终结果。
完整代码与运行示例
下面是整合了两个转换功能的完整代码,你可以直接复制、编译和运行。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h> // 用于 exit 函数
// 函数声明
void decimalToBinary(int decimalNum);
int binaryToDecimal(const char *binaryStr);
int main() {
int choice;
printf("--- 十进制与二进制转换器 ---\n");
printf("1. 十进制 -> 二进制\n");
printf("2. 二进制 -> 十进制\n");
printf("请选择操作 (1 or 2): ");
scanf("%d", &choice);
if (choice == 1) {
int num;
printf("请输入一个十进制整数: ");
scanf("%d", &num);
printf("十进制 %d 对应的二进制是: ", num);
decimalToBinary(num);
} else if (choice == 2) {
char binaryString[32];
printf("请输入一个二进制数: ");
scanf("%s", binaryString);
// 输入验证
for (int i = 0; binaryString[i] != '\0'; i++) {
if (binaryString[i] != '0' && binaryString[i] != '1') {
printf("错误:输入的不是有效的二进制数,\n");
exit(1); // 退出程序
}
}
int decimalNum = binaryToDecimal(binaryString);
printf("二进制 %s 对应的十进制是: %d\n", binaryString, decimalNum);
} else {
printf("无效的选择!\n");
}
return 0;
}
/**
* @brief 将十进制整数转换为二进制并打印
*/
void decimalToBinary(int decimalNum) {
if (decimalNum == 0) {
printf("0\n");
return;
}
int bits = (int)(log2(decimalNum)) + 1;
int binaryNum[bits];
int index = 0;
while (decimalNum > 0) {
binaryNum[index++] = decimalNum % 2;
decimalNum = decimalNum / 2;
}
for (int i = index - 1; i >= 0; i--) {
printf("%d", binaryNum[i]);
}
printf("\n");
}
/**
* @brief 将二进制字符串转换为十进制整数
*/
int binaryToDecimal(const char *binaryStr) {
int decimalNum = 0;
int length = strlen(binaryStr);
int power = length - 1;
for (int i = 0; i < length; i++) {
int bit = binaryStr[i] - '0';
decimalNum += bit * (int)pow(2, power);
power--;
}
return decimalNum;
}
运行示例 1 (十进制 -> 二进制):
--- 十进制与二进制转换器 ---
1. 十进制 -> 二进制
2. 二进制 -> 十进制
请选择操作 (1 or 2): 1
请输入一个十进制整数: 42
十进制 42 对应的二进制是: 101010
运行示例 2 (二进制 -> 十进制):
--- 十进制与二进制转换器 ---
1. 十进制 -> 二进制
2. 二进制 -> 十进制
请选择操作 (1 or 2): 2
请输入一个二进制数: 11111111
二进制 11111111 对应的十进制是: 255
总结与展望
恭喜你!现在你已经不仅理解了十进制和二进制转换的数学原理,还亲手用C语言实现了它们,这为你深入学习计算机科学打下了坚实的基础。
关键要点回顾:
- 十进制转二进制:使用“除2取余法”,结果需逆序输出。
- 二进制转十进制:使用“按权相加法”,从最低位开始计算。
- C语言实现:利用数组存储中间结果,利用字符串处理二进制输入,注意边界条件和输入验证。
进阶思考:
- 如何实现小数的转换?(提示:小数转换用“乘2取整法”)
- 如何实现负数的表示?(提示:学习原码、反码、补码)
- 尝试不使用
log2和pow等库函数,用更“底层”的方式实现这些转换,锻炼你的编程能力。
希望这篇文章对你有帮助,编程的世界充满乐趣,保持好奇心,不断探索,你将成为一名更优秀的程序员!
