long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);
maxSpace = 20000
usedSpace = 8
- > freeSize = -1482836480
为什么结果为负?
答案 0 :(得分:6)
将maxSpace
和usedSpace
的类型从int
更改为long
。如果您不能这样做,那么只需将您的代码更改为
long freeSize = 1000L*1000*(Main.maxSPace - Main.usedSpace);
因此结果将计算为long
,而不是int
。
现在计算如下
Main.maxSPace-Main.usedSpace -> 19992
(Main.maxSPace-Main.usedSpace)*1000 -> 19992000
(Main.maxSPace-Main.usedSpace)*1000*1000L -> 19992000000
问题在于我们对整数进行操作,因此结果也必须是整数,但整数的最大值是
2147483647 so
19992000000 is out of range
因此Java将只获取最后32位的结果并将其更改为整数
10010100111100111011011011000000000 -> 19992000000
10100111100111011011011000000000 -> -1482836480
答案 1 :(得分:3)
maxSpace
和usedSpace
被声明为整数,因此所有算术都是使用整数执行的。只有当您将结果分配给freeSize
时,它才会转换为长整数,但溢出已经发生在那之前。
尝试将1000
替换为1000L
以使强制更早发生:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
答案 2 :(得分:3)
您可能会收到一个负数,因为maxSpace
和usedSpace
是整数。 20000 - 8 = 19992
,19992 * 1000000 = 19992000000
小于Long.MAX_VALUE
(2 63 - 1)但超过Integer.MAX_VALUE
(2 31 < / sup> - 1)。 19992000000 - Integer.MAX_VALUE = 17844516353
仍然超出了int的值。您应该让maxSpace
和usedSpace
为长。
答案 3 :(得分:2)
当maxSpace和usedSpace属于int类型时,由于类型溢出,您将获得负值。使用long代替变量maxSpace和usedSpace。或者,如果您无法更改Main的属性类型,则可以将代码更改为:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);