Problema Java Multiple Two numbers con numeri negativi [duplicato]

Dec 16 2020

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

1 LiveandLetLive Dec 16 2020 at 03:10

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).

1 tibetiroka Dec 16 2020 at 03:09

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).