C 语言实战:十进制转二进制(多组输入 + 正负值兼容)

208 阅读7分钟

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 的循环过程:

    1. dec=5 → remainder=1 → binary[0]=1 → dec=2;
    2. dec=2 → remainder=0 → binary[1]=0 → dec=1;
    3. 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]); }
}

六、新手避坑指南

  1. 遗漏 0 的处理:未加if(dec==0)判断,输入 0 时无输出;
  2. 负数未取绝对值:直接对负数除 2 取余,会得到错误的余数(如 - 5%2 在 C 语言中结果为 - 1);
  3. 数组越界:二进制数组长度需足够(int 占 32 位,定义binary[32]即可);
  4. 忘记逆序输出:直接顺序输出余数,得到的是低位在前的错误结果;
  5. 未引入 stdlib.h:使用abs()函数时漏加头文件,编译报错。