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

maxSpace = 20000
usedSpace = 8

-->freeSize = -1482836480

为什么这个结果是否定的?

4

4 回答 4

6

将类型maxSpaceusedSpace从更改intlong。如果你不能这样做,那么只需将你的代码更改为类似

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
于 2013-04-08T23:38:57.997 回答
3

maxSpaceusedSpace被声明为整数,所以所有的算术都是用整数执行的。仅当您将结果分配给时,freeSize它才会转换为 long,但在此之前发生了溢出。

尝试将数字替换为10001000L使强制更早发生:

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
于 2013-04-08T23:08:50.927 回答
3

你可能得到一个负数,因为maxSpaceusedSpace是整数。20000 - 8 = 1999219992 * 1000000 = 19992000000小于Long.MAX_VALUE(2 63 - 1) 但大于Integer.MAX_VALUE(2 31 - 1)。19992000000 - Integer.MAX_VALUE = 17844516353这仍然超出了 int 值的范围。你应该maxSpace放任自流usedSpace

于 2013-04-08T23:09:54.203 回答
2

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

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
于 2013-04-08T23:08:53.710 回答