long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);
maxSpace = 20000
usedSpace = 8
-->freeSize = -1482836480
为什么这个结果是否定的?
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);
maxSpace = 20000
usedSpace = 8
-->freeSize = -1482836480
为什么这个结果是否定的?
将类型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
maxSpace
和usedSpace
被声明为整数,所以所有的算术都是用整数执行的。仅当您将结果分配给时,freeSize
它才会转换为 long,但在此之前发生了溢出。
尝试将数字替换为1000
以1000L
使强制更早发生:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
你可能得到一个负数,因为maxSpace
和usedSpace
是整数。20000 - 8 = 19992
,19992 * 1000000 = 19992000000
小于Long.MAX_VALUE
(2 63 - 1) 但大于Integer.MAX_VALUE
(2 31 - 1)。19992000000 - Integer.MAX_VALUE = 17844516353
这仍然超出了 int 值的范围。你应该maxSpace
放任自流usedSpace
。
当 maxSpace 和 usedSpace 是 int 类型时,由于类型溢出,您将得到一个负值。对变量 maxSpace 和 usedSpace 都使用 long。或者,如果您无法更改 Main 的属性类型,您可以将代码更改为:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);