C 语言实战:十进制转二进制(多组输入 + 正负值兼容)
十进制转二进制是编程入门的经典进制转换场景,核心逻辑是 “除 2 取余、逆序输出”。本文通过完整的 C 语言代码实现 “批量转换多个十进制数为二进制” 的功能,兼容正负整数转换,拆解余数存储、逆序输出、负数处理等核心逻辑,帮助掌握进制转换的底层实现思路。
一、进制转换核心规则
1. 十进制转二进制原理
- 正数转换:将十进制数反复除以 2,记录每次的余数(0 或 1),直到商为 0,最后逆序输出余数(余数的逆序即为二进制结果);示例:十进制 5 → 5÷2=2 余 1 → 2÷2=1 余 0 → 1÷2=0 余 1 → 逆序余数得 101(二进制)。
- 负数转换:先取负数的绝对值,按正数规则转换,最后在结果前添加负号(本文实现 “符号位标注” 的简易负数转换,非补码形式);
- 特殊值 0:直接输出 0,避免除 2 循环无结果。
2. 程序设计要点
- 多组输入:支持用户指定转换的数字个数,批量处理;
- 边界校验:输入个数需为正整数,避免无效循环;
- 兼容性:支持正负整数及 0 的转换。
二、完整代码实现与解析
c
运行
/******************************
*文件名称:3.Base_Conversion.c
*作者:czy
*邮箱:caozhiyang_0613@163.com
*创建日期:2025/12/29
*修改日期:
*文件功能:输入 10 进制数转换为二进制进行输出 n个数
*****************************/
#include<stdio.h>
#include<stdlib.h> // 包含abs()函数,用于取绝对值
/************************************************
*函数名称:To_Binary
*函数功能: 单个十进制数转二进制输出
*输入参数: dec - 待转换的十进制整数
*返回参数: 无
*创建时间:2025/12/29
*函数作者:czy
**************************************************/
void To_Binary(int dec)
{
if(dec==0) // 特殊值:0直接输出0
{
printf("0");
return;
}
int remainder;// 存储每次除以2的余数
int binary[32];// 存储二进制余数(int占32位,足够存储所有余数)
int i=0;// 数组下标,记录余数存储位置
int j;
// 负数处理:输出负号,取绝对值后转换
if(dec<0)
{
printf("-");
dec = abs(dec);// 取绝对值,转为正数处理
}
// 核心:除2取余,存储余数(低位在前)
while(dec>0)
{
remainder = dec % 2;// 取余数(0/1)
binary[i++] = remainder;// 余数存入数组,下标自增
dec = dec / 2;// 商作为新的被除数,继续处理
}
// 逆序输出余数(低位在前→高位在前,得到正确二进制)
for(j=i-1;j>=0;j--)
{
printf("%d",binary[j]);
}
}
int main()
{
int n; // 要转换的数字个数
int num;// 存储每个待转换的十进制数
int i;
printf("===== 十进制转二进制 =====\n");
printf("请输入要转换的十进制数的个数:\n");
scanf("%d",&n);
// 边界校验:个数必须为正整数
if(n<=0)
{
printf("必须为正整数!\n");
return 1; // 非0返回,标记程序异常退出
}
// 循环读取n个十进制数,逐个转换
for(i=0;i<n;i++)
{
printf("\n请输入第%d个十进制数:\n", i + 1);
scanf("%d", &num);
printf("第%d个数 %d 的二进制是:", i + 1, num);
To_Binary(num); // 调用转换函数
printf("\n");
}
return 0;
}
三、核心模块拆解
1. 工具函数:To_Binary(单个十进制数转二进制)
(1)特殊值处理(dec=0)
c
运行
if(dec==0)
{
printf("0");
return;
}
- 若输入 0,直接输出 0 并返回,避免进入后续除 2 循环(0÷2 商为 0,循环不会执行,导致无输出)。
(2)负数处理
c
运行
if(dec<0)
{
printf("-");
dec = abs(dec);
}
- 先输出负号,再通过
abs()函数(需引入stdlib.h)取绝对值,将负数转为正数处理; - 注意:
abs()是整数取绝对值函数,若处理小数需用fabs()。
(3)除 2 取余核心循环
c
运行
while(dec>0)
{
remainder = dec % 2; // 取余数(二进制位)
binary[i++] = remainder; // 余数存入数组(低位在前)
dec = dec / 2; // 商作为新的被除数
}
-
示例:十进制 5 的循环过程:
- dec=5 → remainder=1 → binary[0]=1 → dec=2;
- dec=2 → remainder=0 → binary[1]=0 → dec=1;
- dec=1 → remainder=1 → binary [2]=1 → dec=0(循环结束);
-
数组中存储的余数为
[1,0,1](低位在前),需逆序输出得到101。
(4)逆序输出余数
c
运行
for(j=i-1;j>=0;j--)
{
printf("%d",binary[j]);
}
- 数组下标
i在循环后指向 “最后一个余数的下一位”,因此从i-1开始逆序输出; - 逆序后,低位在前的余数变为高位在前,得到正确的二进制数。
2. 主函数:流程整合与多组输入
(1)输入校验
c
运行
if(n<=0)
{
printf("必须为正整数!\n");
return 1;
}
- 校验转换个数
n的合法性,避免 0 或负数导致无效循环; return 1:区别于正常退出的return 0,明确标记程序异常。
(2)多组输入与转换
c
运行
for(i=0;i<n;i++)
{
printf("\n请输入第%d个十进制数:\n", i + 1);
scanf("%d", &num);
printf("第%d个数 %d 的二进制是:", i + 1, num);
To_Binary(num);
printf("\n");
}
- 循环
n次,逐个读取十进制数并调用To_Binary转换; - 提示式输入(如 “第 1 个十进制数”)提升用户体验,输出时标注数字序号,结果更清晰。
四、运行结果示例
示例 1:输入正数(n=2,数字 5、8)
plaintext
===== 十进制转二进制 =====
请输入要转换的十进制数的个数:
2
请输入第1个十进制数:
5
第1个数 5 的二进制是:101
请输入第2个十进制数:
8
第2个数 8 的二进制是:1000
示例 2:输入负数(n=1,数字 - 7)
plaintext
===== 十进制转二进制 =====
请输入要转换的十进制数的个数:
1
请输入第1个十进制数:
-7
第1个数 -7 的二进制是:-111
示例 3:输入 0(n=1,数字 0)
plaintext
===== 十进制转二进制 =====
请输入要转换的十进制数的个数:
1
请输入第1个十进制数:
0
第1个数 0 的二进制是:0
示例 4:输入非法个数(n=0)
plaintext
===== 十进制转二进制 =====
请输入要转换的十进制数的个数:
0
必须为正整数!
五、扩展优化思路
1. 补码形式输出负数
本文的负数转换仅添加负号,实际计算机中负数以补码存储,可扩展为输出补码:
c
运行
// 32位补码输出(以int为例)
void To_Binary(int dec)
{
if(dec == 0) { printf("0"); return; }
unsigned int udec; // 无符号整数存储补码
if(dec < 0)
{
udec = ~abs(dec) + 1; // 求补码:取反+1
}
else
{
udec = dec;
}
// 输出32位补码
for(int j=31; j>=0; j--)
{
printf("%d", (udec >> j) & 1);
}
}
2. 支持任意进制转换(2~16)
修改To_Binary函数为通用进制转换函数,支持 2~16 进制:
c
运行
void To_Base(int dec, int base)
{
if(dec == 0) { printf("0"); return; }
if(base < 2 || base > 16) { printf("进制需为2~16!"); return; }
char digits[] = "0123456789ABCDEF"; // 存储16进制字符
int remainder;
char res[32];
int i=0;
if(dec < 0) { printf("-"); dec = abs(dec); }
while(dec > 0)
{
remainder = dec % base;
res[i++] = digits[remainder];
dec = dec / base;
}
for(int j=i-1; j>=0; j--) { printf("%c", res[j]); }
}
六、新手避坑指南
- 遗漏 0 的处理:未加
if(dec==0)判断,输入 0 时无输出; - 负数未取绝对值:直接对负数除 2 取余,会得到错误的余数(如 - 5%2 在 C 语言中结果为 - 1);
- 数组越界:二进制数组长度需足够(int 占 32 位,定义
binary[32]即可); - 忘记逆序输出:直接顺序输出余数,得到的是低位在前的错误结果;
- 未引入 stdlib.h:使用
abs()函数时漏加头文件,编译报错。