Problema Java Multiple Two numbers con numeri negativi [duplicato]
Di recente sto affrontando il problema seguente
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
int i = -2147483648;
int j = i * -1;
System.out.println("j="+j);
}
}
Risultato: -2147483648
IDE online con codice: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight
Ma come funziona secondo la logica di cui ho bisogno per ottenere 2147483648 è un risultato giusto? Allora come ho ottenuto questo numero negativo? È a causa dell'intervallo intero (Integer.MIN_VALUE)? come risolvere questo problema?
Risposte
Il valore massimo positivo che una intlattina può contenere è 2147483647oltre il quale il valore va all'altro capo (cioè inizia dall'estremità negativa). Puoi capirlo dalla seguente demo:
public class Main {
public static void main(String[] args) {
int i = -2147483648;
int j = i * -1;
System.out.println("j=" + j);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE + 1);
System.out.println(Integer.MIN_VALUE);
// Some more examples for you to understand this concept better
System.out.println(Integer.MAX_VALUE + 2);
System.out.println(Integer.MAX_VALUE + 3);
}
}
Produzione:
j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646
Dopo che -2147483648è stato moltiplicato con -1, diventa 2147483648ma una intvariabile non può contenere questo grande valore positivo; quindi, inizierà dall'estremità negativa (cioè Integer.MIN_VALUE).
Il numero 2147483648 non esiste. Il valore più grande di un int è 2147483647, che è inferiore di 1 rispetto al risultato previsto. La moltiplicazione causa un overflow, che "riporta" il numero al valore negativo più piccolo e continua il calcolo da lì. (In altre parole: 2147483647 + 1 = -2147483648 (più piccolo negativo)) Poiché il risultato sarebbe solo 1 sopra il valore massimo, non è richiesta alcuna azione aggiuntiva e viene restituito il valore int minimo.
Se vuoi risolvere questo problema, usa "long" invece di "int" per le tue variabili. Puoi anche utilizzare classi più complesse come BigDecimal o scrivere una funzione di moltiplicazione personalizzata per matrici di byte.
Nota: indipendentemente dal tipo numerico che usi, fintanto che la memoria utilizzata per rappresentare il numero è finita puoi incorrere in problemi simili. Sebbene in circostanze normali sia improbabile, anche per un intero a 32 bit (int).