【问题标题】:Integer min and max values整数最小值和最大值
【发布时间】:2013-06-27 20:10:53
【问题描述】:

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

【问题讨论】:

  • 是的,它确实加减2。理解输出有什么问题吗?
  • 那么这本书是错的。它说如果我们从最小值中减去 1,它必须是 -2147483469,但它变成了 2147483646 因为二进制的东西。所以书中“减1”这句话是错误的
  • 我不明白这个问题,也不明白中间minmax变量的意义。
  • 马特。问题很清楚。如果我不是初学者,我可以更好地回答你,所以重点是理解书中所写的原始数据类型,哈哈。我没有写那个例子
  • 安德鲁,我之前看过发帖规则,真的很抱歉。这是因为我在学习新事物时不耐烦。不会再发生了

标签: java types integer


【解决方案1】:

请注意,aInteger.MAX_VALUE - 1bInteger.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 Language Specification, §15.18.2

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

JLS 是此类问题的最终权威,但我不建议将其作为学习 Java 的一种方式阅读。你最好通过Java Language Tutorial。内容比较全面,内容质量很高。

【讨论】:

  • 非常感谢。我只想从适合初学者的资源中学习编程语言。但我真的找不到一个好的
  • @Geomatics - Java 语言书籍的质量差异很大。有些很好,但有些只是浪费树木。我建议通过 Oracle 的 Java Language Tutorial 系列。
猜你喜欢
  • 2012-11-20
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多