我是编程新手。我正在学习一本Java对象编程书籍,并在计算机上同时执行书中的教程和示例。
书中说整数的最大值和最小值是;
Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648
那么好吧。这里没有问题,但是;
它表示如果我们将最大值加 1,并从最小值减 1;
class test {
public static void main(String[] args) {
int min = Integer.MIN_VALUE -1;
int max = Integer.MAX_VALUE +1;
int a = min - 1;
int b = max + 1;
System.out.println("min - 1 =" + a);
System.out.println("max - 1 =" + b);
}
}
因此我们发现;
min - 1 = 2147483646
max + 1 = -2147483647
它说这个结果是因为内存中的二进制过程受到32位的限制。
我无法理解的事情。这段代码不是分别对最大值和最小值加2、减2吗?
int min = Integer.MIN_VALUE -1; // subtracted 1 here
int max = Integer.MAX_VALUE +1; // added 1 here
int a = min - 1; // subtracted 1 here
int b = max + 1; // added 1 here
注意a
is Integer.MAX_VALUE - 1
and b
is Integer.MIN_VALUE + 1
。所以是的,在每种情况下它确实都减去并加了 1 两次。这本书没有错,但这是一种愚蠢的关于环绕溢出的教学方式。刚刚打印Integer.MIN_VALUE - 1
and Integer.MAX_VALUE + 1
就已经说明了这一点。
int min = Integer.MIN_VALUE -1; // min is set to Integer.MAX_VALUE by underflow
int max = Integer.MAX_VALUE +1; // max is set to Integer.MIN_VALUE by overflow
来自Java 语言规范,第 15.18.2 节 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.2:
如果整数加法溢出,则结果是以某种足够大的二进制补码格式表示的数学和的低位。
对于此类问题,JLS 是终极权威,但我不建议将其作为学习 Java 的方式来阅读。你最好经历一下Java 语言教程 http://docs.oracle.com/javase/tutorial/java/。它相当全面,内容质量非常高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)