Java Integer.MAX_VALUE 和 Integer.MIN_VALUE

4

以下是代码示例:

BigInteger number=new BigInteger("2154789654785210095153123254756845");
boolean b=number.longValue()>Long.MIN_VALUE;
boolean c=number.longValue()<Long.MAX_VALUE;
boolean d=number.longValue()>=Integer.MIN_VALUE;
boolean e=number.longValue()<=Integer.MAX_VALUE;
System.out.println(""+b);
System.out.println(""+c);
System.out.println(""+d);
System.out.println(""+e);

生成输出。
true
true
false
true

请记住,在 Integer 达到 MAX_VALUE 后,值会回到 MIN_VALUE 并重新循环。如果一个值是 <=Integer.MAX_VALUE,那么它必须是 >=Integer.MIN_VALUE,那么为什么布尔变量 d 返回 false

3个回答

12
一旦我们了解longValue() 返回的内容,就可以解释这个问题。

将此BigInteger转换为long。此转换类似于Java™语言规范第5.1.3节中定义的从long到int的缩小原始转换:如果此BigInteger太大而无法适应long,则仅返回低位64位。请注意,此转换可能会丢失有关BigInteger值的总体大小以及返回相反符号的结果信息。

打印该变量的值为-4694333933485660691,这个值肯定是合法的long值,但远小于Integer.MIN_VALUE(在此隐式转换为long),因此第一个输出d的结果是false

由于值-4694333933485660691大于Long.MIN_VALUE并且小于Long.MAX_VALUE,所以输出bc的结果都是true。当调用longValue()时,只有那些可以转换为Long.MIN_VALUELong.MAX_VALUE自身的BigInteger才会为bc输出false


2
可能需要指出的是,在 long >= int 的情况下,比较之前会将 int 值强制转换为 long - Andreas
@MaxZoom 为什么不会呢? - njzk2
b 为假的唯一可能是 longValue 恰好等于 MIN_VALUE,其他所有的 long 值都大于它。c 同理。 - Louis Wasserman

0
自Java 1.8以来,您可以使用{{link1:BigInteger.longValueExact()}},如果BigInteger值无法准确表示为long值,则会抛出ArithmeticException

0

通过以下打印值,可以轻松理解

number.longValue()[-4694333933485660691]>Long.MIN_VALUE[-9223372036854775808  =  true
number.longValue()[-4694333933485660691]<Long.MAX_VALUE[9223372036854775807  =  true
number.longValue()[-4694333933485660691]>=Integer.MIN_VALUE[-9223372036854775808  =  false
number.longValue()[-4694333933485660691]<=Integer.MAX_VALUE[9223372036854775807  =  true

希望这能有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接