long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);
maxSpace = 20000
usedSpace = 8
->freeSize = -1482836480
odejmowanie tęskni idzie źle
Dlaczego jest to wynik ujemny?
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);
maxSpace = 20000
usedSpace = 8
->freeSize = -1482836480
odejmowanie tęskni idzie źle
Dlaczego jest to wynik ujemny?
Zmień typ maxSpace
i usedSpace
z int
na long
. Jeśli nie można tego zrobić, a potem po prostu zmienić swój kod do czegoś jak
long freeSize = 1000L*1000*(Main.maxSPace - Main.usedSpace);
więc wynik byłby liczony jako long
, nie int
.
Teraz jest obliczana jak ten
Main.maxSPace-Main.usedSpace -> 19992
(Main.maxSPace-Main.usedSpace)*1000 -> 19992000
(Main.maxSPace-Main.usedSpace)*1000*1000L -> 19992000000
problemem jest to, że działają na liczb całkowitych, więc wynik musi być liczbą całkowitą, ale maksymalna wartość całkowita wynosi
2147483647 so
19992000000 is out of range
tak Java Wykonaj tylko ostatnie 32 bity wyniku i zmień je na liczbę całkowitą
10010100111100111011011011000000000 -> 19992000000
10100111100111011011011000000000 -> -1482836480
maxSpace
i usedSpace
są zadeklarowane jako ints, więc cała arytmetyczna jest wykonywana z ints. Dopiero po przypisaniu wyniku do freeSize
jest rzutowany na długi, ale wcześniej wystąpiło przepełnienie.
spróbować wymienić numer 1000
z 1000L
spowodować przymus wystąpić wcześniej:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
Kiedy maxSpace i usedSpace są typu int dostaniesz wartość ujemną z powodu typu przepełnienie. Zamiast tego używaj długich dla obu zmiennych maxSpace i usedSpace. Alternatywnie, jeśli nie można zmieniać rodzaje nieruchomości głównych można zmienić swój kod do:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
Prawdopodobnie coraz liczbę ujemną, ponieważ maxSpace
i usedSpace
są ints. 20000 - 8 = 19992
, 19992 * 1000000 = 19992000000
, która jest mniejsza niż Long.MAX_VALUE
(2 - 1), ale jest większa niż Integer.MAX_VALUE
(2 - 1). 19992000000 - Integer.MAX_VALUE = 17844516353
, który jest nadal poza zakresem dla wartości int. Powinieneś pozwolić, aby maxSpace
i usedSpace
były długie.
To są wartości maxSpace i usedSpa ce? – Justin
Czy deklarujesz maxSpace i usedSpace po arytmetyce, czy właśnie mówisz nam, czym są równe? Musisz napisać więcej kodu –
Jakiego rodzaju są zmienne maxSpace, usedSpace? –