Perché Integer.MIN_VALUE - Integer.MAX_VALUE è uguale a 1 in Java?

-3

Se si esegue l'istruzione:

System .out.println( (Integer.MIN_VALUE)-(Integer .MAX_VALUE ));

In java restituisce 1 come risposta. Questo perché Java considera tali valori come interi a 32 bit senza considerare il loro segno?

Integer.MIN_VALUE = 10000000000000000000000000000000
Integer.MAX_VALUE = 1111111111111111111111111111111

Ho capito perché -MIN.VALUE == MIN_VALUE restituisce true. E come MAX_VALUE + 1 provoca l'overflow di Integer e otteniamo il risultato. Ma non riesco a capire chiaramente come funzioni la sottrazione.

    
posta isuru-buddhika 27.05.2018 - 13:08
fonte

2 risposte

11

Java supererà e sottosterzerà i valori int.

max_int = 2147483647   (01111111111111111...1)
min_int = -2147483648  (10000000000000000...0) //first bit is -2^31

under flow:

-2147483648 - 1 =  2147483647

così ....

 min_int- max_int = -2147483648 - 2147483647 
                  = -2147483648 -(1 + 2147483646)
                  = (-2147483648 - 1) - 2147483646
                  = 2147483647 - 2147483646 
                  = 1;
    
risposta data 27.05.2018 - 13:39
fonte
3

Un modo semplice per avvolgere la tua mente: abbiamo un numero pari di bit per memorizzare un numero. Definiamo 0 come il punto "medio" di un intervallo di numeri pari. Ci deve essere una differenza di 1 sia sul lato positivo o negativo di 0 perché il punto medio è una quantità dispari in un numero pari di numeri posible.

Immagina di avere numeri interi a 8 bit. Dov'è il punto "più importante" di questo? O il quarto o il quinto bit:

00010000 //3 bits on the "positive side", 4 bits on the "negative side" 
00001000 //4bits positive, 3 bits negative
    
risposta data 27.05.2018 - 14:35
fonte

Leggi altre domande sui tag