4

我是编程新手。我正在学习 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 吗?

    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
4

1 回答 1

7

注意aisInteger.MAX_VALUE - 1bis Integer.MIN_VALUE + 1。所以是的,在每种情况下,它确实是减和加 1 两次。这本书没有错,但它是一种关于环绕溢出的愚蠢教学方式。只是打印Integer.MIN_VALUE - 1Integer.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

如果整数加法溢出,则结果是数学和的低位,以一些足够大的二进制补码格式表示。

JLS 是此类问题的最终权威,但我不建议将其作为学习 Java 的一种方式来阅读。您最好阅读Java 语言教程。它相当全面,内容非常高质量。

于 2013-06-30T15:46:41.917 回答