2013-04-08 17 views
7
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000); 

maxSpace = 20000 
usedSpace = 8 

->freeSize = -1482836480odejmowanie tęskni idzie źle

Dlaczego jest to wynik ujemny?

+2

To są wartości maxSpace i usedSpa ce? – Justin

+1

Czy deklarujesz maxSpace i usedSpace po arytmetyce, czy właśnie mówisz nam, czym są równe? Musisz napisać więcej kodu –

+0

Jakiego rodzaju są zmienne maxSpace, usedSpace? –

Odpowiedz

5

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 
3

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); 
2

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); 
3

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.