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

Java计算long类型极限值时代码输出错误是什么原因?

你的代码存在三处核心问题

  • 第一处错误是做了不必要的int强转
    int是4字节有符号整型,本身取值范围仅为-2^31 ~ 2^31-1,最大值仅为2147483647,你把远超过该范围的2^63计算结果强转为int,直接触发了整型溢出,截断后得到的int值就是2147483647,取负后自然得到你看到的-2147483647。
  • 第二处错误是使用Math.pow计算大整数存在精度损失
    Math.pow返回值是double类型,双精度浮点数仅能精确表示绝对值小于2^53的整数,超过这个范围的整数会出现精度丢失,哪怕你不强转为int,直接把Math.pow(2,63)的结果转为long也无法得到准确值。
  • 第三处错误是对long的取值边界逻辑判断有误
    long的正数最大值是2^63 -1,你直接计算2^63本身就已经超出了long的正数合法范围,直接计算该值本身就会触发溢出。

正确实现方式

如果要获取long的最小值,推荐直接使用JDK内置的常量Long.MIN_VALUE,不需要手动计算。如果要手动实现,正确的写法是用位运算:1L << 63,对long类型的数字1左移63位后,刚好会得到符号位为1、其余位为0的二进制值,也就是long的最小值。
正确代码示例:

class Limit{
    public static void main(String[] code){
        // 内置常量方式
        System.out.println(Long.MIN_VALUE);
        // 手动位运算方式
        System.out.println(1L << 63);
    }
}

运行后输出结果为-9223372036854775808,和预期一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:07