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

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");

这里存在两个致命问题:

  1. Math.pow(2,63)返回的是double类型值(约9.22e18),而int类型的最大值仅为2^31-1=2147483647,将远大于int范围的数值强制转换为int会触发整数溢出,导致结果完全错误。
  2. 溢出后,(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:25:29