在Java中使用短基元的for循环中的错误?

use*_*588 0 java for-loop short

我在Java中发现了一个非常奇怪的东西,似乎是一个bug.for循环不能正确评估32767处的短值条件(最大值,请参见此处).请参阅下面的示例代码.我在这里错过了什么吗?

for (short i = 32766; i <= 32767; i++) {
    System.out.println("i is now " + i);
    if (i < 0) {
        System.out.println("This should never be printed");
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

i is now 32766
i is now 32767
Run Code Online (Sandbox Code Playgroud)

实际产量:

i is now 32766
i is now 32767
i is now -32768
This should never be printed
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 8

每个可能的short值都是<= 32767,因为32767是一个short可以容纳的最大数字.

这意味着你的状态if永远是真实的,你的循环永远不会结束.

Short.MIN_VALUE由于溢出(不会在Java中引发异常),该值将换行.

一般说明:在Java中使用a的正当理由很少short,几乎所有的计算,循环计数等都应该用int(或long适当的)完成.short通常不会更快,它通常不会为您节省任何空间(除非您有一个数组).