[英]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.