Java 递增primitve类型的最大值

Java 递增primitve类型的最大值,java,max,increment,Java,Max,Increment,我试图理解以下代码: inti=Integer.MAX\u值; 双d=双最大值; System.out.println(i+“:”+(i+1)); System.out.println(d+“:”+(d+1)); 输出为: 2147483647:-2147483648 1.7976931348623157E308:1.7976931348623157E308 对于第一行,i等于最大整数,增加它将得到最小整数值。为什么d没有发生同样的情况 对于这种行为有一个简单的解释吗?您的double无法表

我试图理解以下代码:

inti=Integer.MAX\u值;
双d=双最大值;
System.out.println(i+“:”+(i+1));
System.out.println(d+“:”+(d+1));
输出为:

2147483647:-2147483648
1.7976931348623157E308:1.7976931348623157E308
对于第一行,
i
等于最大整数,增加它将得到最小整数值。为什么
d
没有发生同样的情况


对于这种行为有一个简单的解释吗?

您的
double
无法表示您试图表示的实际数字,因为
double
s失去了准确性。这就是为什么值没有改变,并且实际上没有溢出


对于非
int
类型,溢出将导致无穷大。例如,尝试将该值乘以20,您将看到溢出的作用。

当双精度溢出时,其值变为无穷大,而不是负数

通过简单地将1添加到
Double.MAX_VALUE
中无法溢出的原因是
MAX_VALUE+1==MAX_VALUE
,因为Double的精度不足以产生这两个数字之间的差异

实际上,在跳到下一个可用的双精度之前,您可以添加相当大的数字。例如,不会溢出的:

System.out.println(Double.MAX_VALUE + 1e100); //still Double.MAX_VALUE
这将如预期的那样溢出:

System.out.println(m + (Math.ulp(m) / 2)); //Infinity

整数溢出,因为它以一种格式表示

  • Integer.最大值
    0111…111
  • Integer.MIN\u值
    1000…000
因此,当您尝试将1添加到
Integer.MAX\u VALUE
时,根据正常的加法规则,您将得到
Integer.MIN\u VALUE
。这称为溢出


浮点数有不同的表示形式,它本身不适合这种类型的溢出。它们都是近似值,与您给出的值最接近的近似值是
Double。MAX_值

相关:谢谢您的精确性。