You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无终止条件的short类型for循环输出负数,带条件的却不输出?

Java short类型循环执行差异原因解析

前置基础规则

  • short是Java的16位有符号整数,取值范围为-32768 ~ 32767。Java中对short、byte、char这类长度小于int的类型做算术运算时,会自动提升为int类型计算,赋值回原类型时会做隐式窄化转换,溢出时直接截断高位保留对应位数的补码结果。
  • for循环固定执行顺序:
    1. 仅执行一次初始化逻辑
    2. 判断终止条件,结果为true则进入循环体,为false直接退出循环
    3. 执行循环体代码
    4. 执行迭代语句(如示例中的a++)
    5. 回到步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:27:01