long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);
maxSpace = 20000
usedSpace = 8
->freeSize = -1482836480
anela sottraendo va storto
Perché è questo il risultato negativo?
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);
maxSpace = 20000
usedSpace = 8
->freeSize = -1482836480
anela sottraendo va storto
Perché è questo il risultato negativo?
Cambia tipo di maxSpace
e usedSpace
da int
a long
. Se non è possibile fare questo allora basta modificare il codice a qualcosa come
long freeSize = 1000L*1000*(Main.maxSPace - Main.usedSpace);
così risultato sarebbe calcolato come long
, non int
.
Ora si calcola in questo modo
Main.maxSPace-Main.usedSpace -> 19992
(Main.maxSPace-Main.usedSpace)*1000 -> 19992000
(Main.maxSPace-Main.usedSpace)*1000*1000L -> 19992000000
problema qui è che stiamo operando su interi, così risultato deve essere anche interi, ma il valore massimo di integer è
2147483647 so
19992000000 is out of range
così Java prendi solo gli ultimi 32 bit di risultato e sostituiscilo con l'intero
10010100111100111011011011000000000 -> 19992000000
10100111100111011011011000000000 -> -1482836480
maxSpace
e usedSpace
sono dichiarati come ints, quindi tutta l'aritmetica viene eseguita con ints. Solo quando si assegna il risultato a freeSize
viene eseguito il cast su un valore lungo, ma l'overflow è avvenuto prima di allora.
provare a sostituire il numero 1000
con 1000L
per provocare la coazione a verificarsi in precedenza:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
Quando maxSpace e usedSpace sono di tipo int si otterrà un valore negativo a causa del tipo di overflow. Utilizza invece long per entrambe le variabili maxSpace e usedSpace. In alternativa, se non è possibile modificare i tipi di proprietà di Main è possibile modificare il codice per:
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
Probabilmente si sta ottenendo un numero negativo perché maxSpace
e usedSpace
sono interi. 20000 - 8 = 19992
, 19992 * 1000000 = 19992000000
che è inferiore a Long.MAX_VALUE
(2 - 1) ma è più di Integer.MAX_VALUE
(2 - 1). 19992000000 - Integer.MAX_VALUE = 17844516353
che è ancora fuori dai limiti per il valore di un int. Si consiglia di lasciare maxSpace
e usedSpace
long.
Questi sono i valori di maxSpace e usedSpa ce? – Justin
Dichiarate maxSpace e usedSpace dopo l'aritmetica o ci state semplicemente dicendo che cosa equivalgono? Devi inserire altro codice –
Che tipo sono le variabili maxSpace, usedSpace? –