当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会抛出异常。这与自动(取消)装箱或%
运算符等无关。