HackerRank Java类型适配问题求助:大负数未匹配long类型
问题:Java判断long类型范围时条件失效,大负数输入未输出预期结果
你的代码在处理输入-100000000000000时,没有输出* long,核心问题出在long范围判断的条件计算错误,具体分析和修复如下:
错误原因
你在判断long范围时使用了以下代码:
if(x>=(-(int)Math.pow(2,63)) && x<=(((int)Math.pow(2,63))-1))System.out.println("* long");
这里存在两个致命问题:
Math.pow(2,63)返回的是double类型值(约9.22e18),而int类型的最大值仅为2^31-1=2147483647,将远大于int范围的数值强制转换为int会触发整数溢出,导致结果完全错误。- 溢出后,
(int)Math.pow(2,63)实际会变成-2147483648(32位int溢出后的取模结果),进而导致:-(int)Math.pow(2,63)等于2147483648((int)Math.pow(2,63))-1等于-2147483649
你的输入-100000000000000小于2147483648,同时也小于-2147483649,因此条件不成立,不会输出* long。
另外,你判断int范围的条件同样存在类似问题:((int)Math.pow(2,31))-1会因为溢出得到错误值-2147483649,而非正确的int最大值2147483647。
修复方案
直接使用Java内置的包装类常量来表示各类型的范围,避免手动计算导致的溢出问题:
修复后的核心判断逻辑
if(x >= Byte.MIN_VALUE && x <= Byte.MAX_VALUE) System.out.println("* byte"); if(x >= Short.MIN_VALUE && x <= Short.MAX_VALUE) System.out.println("* short"); if(x >= Integer.MIN_VALUE && x <= Integer.MAX_VALUE) System.out.println("* int"); if(x >= Long.MIN_VALUE && x <= Long.MAX_VALUE) System.out.println("* long");
完整修复代码
import java.util.*; import java.io.*; class Solution{ public static void main(String []argh) { Scanner sc = new Scanner(System.in); int t=sc.nextInt(); for(int i=0;i<t;i++) { try { long x=sc.nextLong(); System.out.println(x+" can be fitted in:"); if(x >= Byte.MIN_VALUE && x <= Byte.MAX_VALUE) System.out.println("* byte"); if(x >= Short.MIN_VALUE && x <= Short.MAX_VALUE) System.out.println("* short"); if(x >= Integer.MIN_VALUE && x <= Integer.MAX_VALUE) System.out.println("* int"); if(x >= Long.MIN_VALUE && x <= Long.MAX_VALUE) System.out.println("* long"); } catch(Exception e) { System.out.println(sc.next()+" can't be fitted anywhere."); } } } }
额外说明
如果不想使用内置常量,也可以直接写对应类型的字面量(注意long类型字面量要加L后缀):
- byte范围:
-128到127 - short范围:
-32768到32767 - int范围:
-2147483648到2147483647 - long范围:
-9223372036854775808L到9223372036854775807L
内容的提问来源于stack exchange,提问作者Aryan S Shandilya
相关产品推荐
相关产品推荐

