减去多头出错了

时间:2013-04-08 23:00:09

标签: java long-integer

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);

maxSpace = 20000
usedSpace = 8

- > freeSize = -1482836480

为什么结果为负?

4 个答案:

答案 0 :(得分:6)

maxSpaceusedSpace的类型从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)

maxSpaceusedSpace被声明为整数,因此所有算术都是使用整数执行的。只有当您将结果分配给freeSize时,它才会转换为长整数,但溢出已经发生在那之前。

尝试将1000替换为1000L以使强制更早发生:

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);

答案 2 :(得分:3)

您可能会收到一个负数,因为maxSpaceusedSpace是整数。 20000 - 8 = 1999219992 * 1000000 = 19992000000小于Long.MAX_VALUE(2 63 - 1)但超过Integer.MAX_VALUE(2 31 < / sup> - 1)。 19992000000 - Integer.MAX_VALUE = 17844516353仍然超出了int的值。您应该让maxSpaceusedSpace为长。

答案 3 :(得分:2)

当maxSpace和usedSpace属于int类型时,由于类型溢出,您将获得负值。使用long代替变量maxSpace和usedSpace。或者,如果您无法更改Main的属性类型,则可以将代码更改为:

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);