Java中signed long类型的for循环是死循环还是会溢出终止?
问题结论
你的判断完全正确,这段代码不属于无限循环,最终会正常终止。
判断依据
- Java中所有整数类型(byte/short/int/long)默认采用有符号补码的存储规则,不存在无符号整数类型,其中
long为64位有符号数:- 取值范围为
-2^63到2^63 - 1,对应常量Long.MIN_VALUE和Long.MAX_VALUE - Java的整数溢出属于静默溢出,不会抛出运行时异常,直接按照补码规则截断高位得到运算结果
- 取值范围为
- 循环的执行逻辑如下:
- x从0开始逐次加1,一直递增到最大值
Long.MAX_VALUE(2^63 -1) - 此时再执行
x++发生溢出,运算结果为Long.MIN_VALUE(即-2^63) - x继续从
Long.MIN_VALUE逐次加1,最终会遍历所有负数取值,直到等于-1 - 当x等于-1时,循环条件
x != -1不成立,循环退出
- x从0开始逐次加1,一直递增到最大值
- 整个循环总共会执行2^64次,由于运算量极大,实际运行几乎不可能跑完完整流程,但逻辑上确实存在终止点,不属于无限循环。
内容的提问来源于stack exchange,提问作者TorusWithSprinkles
相关产品推荐
相关产品推荐

