Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Java增量远远超过最大值时的行为_Java - Fatal编程技术网

当Java增量远远超过最大值时的行为

当Java增量远远超过最大值时的行为,java,Java,考虑: long n = Long.MAX_VALUE; ++n; 在我的JVM中,这个值是Long.MIN\u值。这是规定的行为吗?一些JVM会抛出异常吗 Long.MAX_VALUE 9223372036854775807 = +(2^63-1) : 01111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111 ++n将增加该二进制数,因此将使用符号位: Long.MIN_VALUE -92233720

考虑:

long n = Long.MAX_VALUE;
++n;
在我的JVM中,这个值是
Long.MIN\u值
。这是规定的行为吗?一些JVM会抛出异常吗

Long.MAX_VALUE 9223372036854775807 = +(2^63-1) : 

01111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111
++n将增加该二进制数,因此将使用符号位:

Long.MIN_VALUE -9223372036854775808 = -(2^63) : 

10000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000
这不是jvm的行为,而是二进制数的ICRecomation的行为

++n将增加该二进制数,因此将使用符号位:

Long.MIN_VALUE -9223372036854775808 = -(2^63) : 

10000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000
这不是jvm的行为,而是二进制数的ICRecomation行为。

来自JLS:

如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的2的补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同

来源:

来自JLS:

如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的2的补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同

源:

应为:整数类型溢出和下溢 引用

整数运算符不表示任何类型的溢出或下溢 对

因此,当Java中的算术类型被签名时,将1添加到
Long.MAX\u VALUE
会导致溢出,当Java使用2的补码时,它会转到
Long.MIN\u VALUE

由于JLS引用了所有整数运算符,如
++
将自动溢出该值,而不会导致任何异常,因此应为:整数类型自动溢出和下溢 引用

整数运算符不表示任何类型的溢出或下溢 对

因此,当Java中的算术类型被签名时,将1添加到
Long.MAX\u VALUE
会导致溢出,当Java使用2的补码时,它会转到
Long.MIN\u VALUE

由于JLS引用了所有整数运算符,如
++
将自动溢出该值,并且不会导致任何异常,如中所述:

整数运算符不表示任何类型的溢出或下溢 对

整数运算符可以引发以下异常(§11): 原因:

如果取消装箱,任何整数运算符都可以引发NullPointerException 需要对空引用进行转换(§5.1.8)

整数除法运算符/(§15.17.2)和整数余数 运算符%(§15.17.3)可以引发算术异常,如果 右操作数为零

增量和减量运算符++(§15.14.2,§15.15.1)和-- (§15.14.3,§15.15.2)在装箱时可能抛出OutOfMemory错误 需要转换(§5.1.7),且内存不足 可用于执行转换

以及(如):

如果整数加法溢出,则结果为低阶 以足够大的数值表示的数学和的位数 二补格式。如果发生溢出,则 结果与两者的数学和的符号不同 操作数值

我认为可以安全地假设,在这种情况下不会抛出异常,并且每次它都会溢出到
Long.MIN\u值

,如以下所述:

整数运算符不表示任何类型的溢出或下溢 对

整数运算符可以引发以下异常(§11): 原因:

如果取消装箱,任何整数运算符都可以引发NullPointerException 需要对空引用进行转换(§5.1.8)

整数除法运算符/(§15.17.2)和整数余数 运算符%(§15.17.3)可以引发算术异常,如果 右操作数为零

增量和减量运算符++(§15.14.2,§15.15.1)和-- (§15.14.3,§15.15.2)在装箱时可能抛出OutOfMemory错误 需要转换(§5.1.7),且内存不足 可用于执行转换

以及(如):

如果整数加法溢出,则结果为低阶 以足够大的数值表示的数学和的位数 二补格式。如果发生溢出,则 结果与两者的数学和的符号不同 操作数值


我认为可以安全地假设,在这种情况下不会抛出异常,每次它都会溢出到
Long.MIN\u值

是的,这是预期的。是的,这是预期的。没有回答问题。OP询问为什么
MAX\u VALUE+1=MIN\u VALUE
,一些JVM会抛出异常。这与自动(取消)装箱或
%
操作员等无关。他们没有回答问题。OP询问为什么
MAX\u VALUE+1=MIN\u VALUE
,一些JVM会抛出异常。这与自动(取消)装箱或
%
运算符等无关。