0

我在 Java 中发现了一个非常奇怪的东西,这似乎是一个错误。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;
    }
}

预期输出:

i is now 32766
i is now 32767

实际输出:

i is now 32766
i is now 32767
i is now -32768
This should never be printed
4

3 回答 3

8

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

这意味着您的条件if将始终为真,您的循环将永远不会结束。

Short.MIN_VALUE由于溢出(在 Java 中不会引发异常),该值会回绕。

一般注意事项:在 Java中使用 a 的正当理由很少short,几乎所有计算、循环计数等都应该使用int(或long酌情)完成。short通常不会更快,并且通常不会为您节省任何空间(除非您有数组)。

于 2013-06-10T09:37:52.027 回答
3

当您使用(即 2^15 - 1,即 32767)进入for循环时,条件仍然成立!Short.MAX_VALUEi <= 32767

结果,i增加了,你再次进入循环......现在我是Short.MIN_VALUE

于 2013-06-10T09:37:45.113 回答
1

因为条件是<=32767条件为真并且值i再次递增。由于 的最大值short为 32767,将其加一i等于 -32768,但仍小于或等于 32767。

short:short 数据类型是一个 16 位有符号二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。与 byte 一样,适用相同的准则:在内存节省实际上很重要的情况下,您可以使用 short 来节省大型数组中的内存。

看看这里:原始数据类型

于 2013-06-10T09:40:27.380 回答