为何无终止条件的short类型for循环输出负数,带条件的却不输出?
Java short类型循环执行差异原因解析
前置基础规则
- short是Java的16位有符号整数,取值范围为
-32768 ~ 32767。Java中对short、byte、char这类长度小于int的类型做算术运算时,会自动提升为int类型计算,赋值回原类型时会做隐式窄化转换,溢出时直接截断高位保留对应位数的补码结果。 - for循环固定执行顺序:
- 仅执行一次初始化逻辑
- 判断终止条件,结果为true则进入循环体,为false直接退出循环
- 执行循环体代码
- 执行迭代语句(如示例中的
a++) - 回到步骤2重复判断
第一个循环的执行逻辑
你提供的第一段无终止条件的循环:
for(short a = 1; ; a++) System.out.println(a);
由于没有显式写终止条件,默认终止条件恒为true,属于死循环。
当a自增到short的最大值32767后,再次执行a++:运算时a先提升为int,加1得到int值32768,赋值回short时截断低16位,对应的补码0x8000就是short类型的-32768,发生负向溢出,因此循环会继续执行,输出负数不会停止。
第二个循环的执行逻辑
你提供的第二段代码的循环条件a <= -2初始值a=1就不满足,不会有任何输出,结合你描述的“仅输出到short最大值、不输出负数”的现象,推测为输入笔误,符合现象的合理循环条件应为a >= 0:
// 修正后符合描述的代码 for(short a = 1;a >= 0 ; a++) System.out.println(a);
该场景下,a在1~32767区间时,a >= 0判断结果为true,正常输出对应数值;当a=32767时,判断条件成立,输出32767后执行a++溢出为-32768;再次判断终止条件-32768 >= 0结果为false,直接退出循环,因此不会输出任何负数,仅输出到short的最大值为止。
内容的提问来源于stack exchange,提问作者Haiyanman
相关产品推荐
相关产品推荐

