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
相关产品推荐
相关产品推荐

