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

复合赋值运算符返回错误值(十进制转二进制)

十进制转二进制程序异常问题分析与解决

核心原因判断

从你给出的现象(调试时余数r值正确,但最终bin变量最后一位不符)来看,问题集中在二进制结果的存储/赋值逻辑上,以下是最可能的几种场景:

1. 整数类型存储溢出

如果你的bin是用int/long这类整数类型存储,通过bin = bin * 10 + r的方式拼接二进制位,当数值过大时会触发整数溢出。比如99999的二进制有17位,拼接成十进制整数后虽然没超出64位整数范围,但如果你的代码用了32位int,或者后续更大的数值,溢出后会导致二进制位的最后一位被错误覆盖(比如你看到的2就是溢出后内存中的随机残留值)。

2. 字符拼接的ASCII值错误

如果bin是字符串数组,你可能直接将余数r的数值存入数组,而没有加上字符'0'的ASCII偏移量:

// 错误写法:存入的是数字1/0的数值,不是对应的字符
bin[i] = r;
// 正确写法:转成ASCII字符
bin[i] = '0' + r;

另外,如果字符串未正确添加终止符'\0',输出时可能读到内存中相邻的随机值,导致最后一位变成2。

3. 输出格式符不匹配

如果bin是long long类型,但打印时误用了%d(对应int)格式符,会导致数值被截断,最后一位出现错误值。

修复方案

  • 优先改用字符串存储二进制结果:这是十进制转二进制的标准实现方式,彻底避免溢出问题。示例代码:
    #include <stdio.h>
    #include <string.h>
    
    int main() {
        int num = 99999;
        char bin[32] = {0}; // 预留足够空间存32位二进制
        int idx = 0;
    
        while (num > 0) {
            int r = num % 2;
            bin[idx++] = '0' + r; // 将余数转为ASCII字符
            num /= 2;
        }
        strrev(bin); // 反转字符串得到正确顺序
        printf("%s\n", bin);
        return 0;
    }
    
  • 若坚持用整数存储:确保使用unsigned long long这类足够大的类型,打印时用%llu格式符匹配。
  • 检查复合赋值语句:确认是bin = bin * 10 + r,无额外的数值偏移错误。

内容的提问来源于stack exchange,提问作者abcxyz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:10:00