You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

十进制转二进制代码在多编译器输出异常的原因及解决咨询

十进制转二进制C代码跨编译器异常问题排查与修复

问题描述

编写了一段将十进制数转换为二进制数的C语言代码,在Dev C中运行输入6时输出正确结果110,但在Code::Blocks和在线评测平台中输出109;Dev C对其他数值测试正常,但Code::Blocks偶尔会输出错误结果。代码如下:

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

int main(){
    int n=0, nhiphan=0, m=0, thuong=0, du=0;
    scanf("%i", &n);

    while(n>0){
        du=n%2;
        nhiphan = nhiphan + (du)*pow(10,m);
        m++;
        thuong = n/2;
        n=thuong;
    }
    printf("%i\n", nhiphan);
}

问题原因

核心问题出在**pow()函数的浮点精度误差**:

  • pow()是C标准库中用于计算幂的浮点函数,返回值为double类型。由于浮点数二进制存储的精度限制,计算pow(10, m)时可能得到接近目标值但略小的结果,比如pow(10,2)可能返回99.9999999999而非精确的100。
  • 当这个浮点值被强制转换为整数时(nhiphan是int类型),小数部分会被直接截断,导致du * pow(10,m)的结果比预期小1。比如输入6时,第三次循环中pow(10,2)返回近似99.9999,乘以1后得到99,加到之前的10上就得到109,而非正确的110。
  • Dev C++使用的浮点库实现恰好让pow()的精度误差未触发这个问题,但其他编译器/平台的浮点库没有这种“巧合”,因此出现错误。
  • 此外,用整数nhiphan存储二进制的十进制表示还存在溢出风险:当输入的十进制数较大时,10^m会快速超出int类型的存储范围,导致数值溢出进而出现错误结果。

修复方案

方案1:用整数运算替代pow()

避免使用浮点函数,改用整数乘法累积结果,彻底消除精度误差:

#include <stdio.h>

int main(){
    int n=0, nhiphan=0;
    scanf("%i", &n);

    while(n>0){
        int du = n % 2;
        nhiphan = nhiphan * 10 + du; // 用整数乘法替代pow
        n = n / 2;
    }
    printf("%i\n", nhiphan);
}

方案2:用字符串存储二进制结果(推荐)

彻底避免整数溢出问题,适合处理更大范围的十进制数:

#include <stdio.h>

int main(){
    int n=0;
    char binary[32]; // 足够存储32位二进制数(覆盖常用int范围)
    int idx = 0;

    scanf("%i", &n);

    // 特殊处理输入0的情况
    if(n == 0){
        printf("0\n");
        return 0;
    }

    while(n > 0){
        binary[idx++] = (n % 2) + '0'; // 将余数转为字符
        n = n / 2;
    }

    // 反转字符串(因为计算时是从低位到高位存储)
    for(int i=0; i < idx/2; i++){
        char temp = binary[i];
        binary[i] = binary[idx - 1 - i];
        binary[idx - 1 - i] = temp;
    }
    binary[idx] = '\0'; // 添加字符串结束符

    printf("%s\n", binary);
}

总结

  • 永远不要用浮点函数处理需要精确整数运算的场景,精度误差会导致难以排查的跨平台问题。
  • 存储二进制结果时,字符串是比整数更可靠的选择,尤其是当输入数值较大时。

内容的提问来源于stack exchange,提问作者Nam Lê Ngọc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:22:33