繁体   English   中英

在for循环中使用Java中的短原语进行bug吗?

[英]Bug in for loop with short primitive in Java?

我发现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

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

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

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

一般说明:在Java中使用short合法理由很少 ,几乎所有的计算,循环计数等操作都应使用int (或适当的long )来完成。 short通常不会更快,并且通常不会为您节省任何空间(除非您有数组)。

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

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

因为条件<=32767所以条件为TRUE,并且i的值再次增加。 由于short的最大值为32767,因此将其递增1会使i等于-32768, i仍小于或等于32767。

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

在这里看看: 原始数据类型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM