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

maxSpace = 20000 
usedSpace = 8 

->freeSize = -1482836480anela sottraendo va storto

Perché è questo il risultato negativo?

+2

Questi sono i valori di maxSpace e usedSpa ce? – Justin

+1

Dichiarate maxSpace e usedSpace dopo l'aritmetica o ci state semplicemente dicendo che cosa equivalgono? Devi inserire altro codice –

+0

Che tipo sono le variabili maxSpace, usedSpace? –

risposta

5

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 
3

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

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

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.

Problemi correlati