十进制转二进制Java程序异常:输入1024及更大值返回错误结果
问题分析与修复方案
嘿,这个问题很典型——你用int类型来存储二进制结果,这会触发整数溢出,这就是为什么1024及更大的数会返回错误值。
为什么小于1024没问题?
1023的二进制是1111111111(10个连续的1),当你把它当作十进制整数存在int里时,值是1111111111(约11亿),而Java中int的最大值是2147483647(约21亿),所以这个数还在int的有效范围内,不会出问题。
为什么1024就崩了?
1024的二进制是10000000000(1后面跟10个0),对应的十进制整数是10000000000(100亿),这远远超过了int的最大值。当int的数值超出范围时,会发生溢出回绕(按照补码规则循环到负数区间),最终得到的就是你看到的那个奇怪的数值1410065408。
靠谱的修复方案:用String存储二进制结果
既然数值类型有范围限制,最稳妥的办法是用String来拼接二进制位,这样不管输入多大的数(只要在int的输入范围内),都能正确得到二进制字符串。修改后的代码如下:
public static String returnBinary(int number) { // 特殊处理输入为0的情况,避免返回空字符串 if (number == 0) { return "0"; } StringBuilder binaryBuilder = new StringBuilder(); while (number > 0) { // 取当前最低位的二进制值 int currentBit = number % 2; // 拼接到字符串中(此时是从低位到高位) binaryBuilder.append(currentBit); // 右移一位,相当于除以2 number = number / 2; } // 反转字符串,得到正确的高位到低位顺序 return binaryBuilder.reverse().toString(); }
补充说明
如果非要用数值类型,你可以换成long,但long也有上限(最大能存63位二进制数),超过后还是会溢出。所以用String是最通用、最不会踩坑的方案。
内容的提问来源于stack exchange,提问作者Andrew Zaw
相关产品推荐
相关产品推荐

