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

Java中将long强制转换为int时返回-9而非报错是什么原因?

Java long显式强转int输出-9问题解答

为什么没有出现编译错误或默认警告

你在代码中手动添加了(int)显式强制类型转换声明,Java语言规范允许原始类型的窄化转换操作,编译器默认认为你已提前知晓该操作可能存在精度丢失风险,因此不会抛出编译错误,IDE默认也不会触发相关警告。

为什么输出结果为-9

相关底层规则如下:

  • Java中int为32位有符号整数,取值范围是-2^31 ~ 2^31-1(即-2147483648到2147483647),long为64位有符号整数
  • 显式将long强转为int时,JVM会直接截断long的高32位二进制位,仅保留低32位,再将这32位作为int的补码解析为十进制值

你测试用的21474836471L满足换算关系:
21474836471 = 5 * 2^32 - 9
对2^32取模(对应截断高32位的操作)后得到的低32位无符号值为2^32 - 9,将该值作为32位有符号补码解析时,最高位为1代表负数,最终对应的十进制值就是-9,和你的运行结果一致。

避免静默精度丢失的方案

  • Java 8及以上版本可使用Math.toIntExact(long value)方法替换强制转换,当long值超出int取值范围时,该方法会主动抛出ArithmeticException,不会出现静默截断问题,示例代码如下:
long someLong = 21474836471L;
int longToInt = Math.toIntExact(someLong); // 超出范围时此处抛出ArithmeticException
System.out.println(longToInt);
  • 若需要IDE提前给出风险提示,可以在IDE的代码检查规则中开启「数值转换丢失精度」相关的提示项,后续存在风险的显式强转操作会触发IDE警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:33:03