整数的最小和最大值

5

我是一个编程新手。我正在学习一本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

1
是的,它确实会加减2。你有理解输出方面的问题吗? - Rohit Jain
那么这本书是错的。它说如果我们从最小值中减去1,那么它必须是-2147483469,但由于二进制的原因,它变成了2147483646。所以书中的“减1”这句话是错误的。 - user1948951
我不理解这个问题,也不明白中间的“min”和“max”变量的意义。 - Matt Ball
马特。问题很清楚。如果我不是初学者,我可以更好地回答你,所以关键是要理解书中写的原始数据类型。我没有写那个例子。 - user1948951
  1. 在标题中不需要添加主要标签。
  2. 请在句子开头加上大写字母。同时,对于单词"I"、缩写和首字母缩略词(如JEE或WAR),也要使用大写字母。这样可以更容易地让人们理解和帮助。
  3. 对于代码块,请使用一致且逻辑清晰的缩进。代码的缩进旨在帮助人们理解程序流程。
- Andrew Thompson
1
Andrew,我之前已经阅读了发布规则,非常抱歉。这是因为我在学习新事物时太过急躁了。以后不会再犯了。 - user1948951
1个回答

8
请注意,aInteger.MAX_VALUE - 1,而bInteger.MIN_VALUE + 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语言教程进行学习。它非常全面,内容质量也很高。

非常感谢,Ted。我只是想从一个适合初学者的资源中学习编程语言。但我真的找不到一个好的资源。 - user1948951
@Geomatics - Java语言的书籍质量参差不齐。有些很好,但有些只是浪费纸张。我建议阅读Oracle的Java语言教程系列。 - Ted Hopp

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