将表达式强制转换为long类型为何未生效?
问题原因分析与解决方案
核心原因:整数运算的类型优先级
Java里,当两个int类型的数值做运算时,运算结果会保持int类型——哪怕你后续把结果强制转成long,也改变不了一个事实:溢出已经在int运算阶段发生了。
拿你的代码举例:
long test = (long) (2147483647 + 1);
- 2147483647是int的最大值(对应
Integer.MAX_VALUE),1也是int类型 - 两者相加时,Java会先在int的范围内计算,结果2147483648超出了int的取值范围(int能存的最大值是2147483647,最小值是-2147483648),直接触发整数溢出,实际得到的是-2147483648(int溢出后的循环值)
- 之后再把这个溢出后的int值转成long,得到的自然是-2147483648L,而不是你预期的2147483648L
用Integer.MAX_VALUE + 1的情况完全一致,因为Integer.MAX_VALUE本身就是int类型,加1同样先触发int溢出,再转long也无法修复。
正确写法
要避免这个问题,只需要让运算在long类型的范围内进行——把其中一个操作数转成long,Java会自动把另一个int操作数提升为long,运算结果就是正确的long值:
// 写法1:把第一个数转成long long test = (long)2147483647 + 1; // 写法2:用long类型的1L long test = Integer.MAX_VALUE + 1L; // 写法3:把Integer.MAX_VALUE转成long long test = (long)Integer.MAX_VALUE + 1;
这些写法里,运算时至少有一个操作数是long,整个运算会在long范围内执行,不会发生溢出,最终得到正确的2147483648L。
内容的提问来源于stack exchange,提问作者Dari_OS
相关产品推荐
相关产品推荐

