2015-07-21 13 views
7

Considera il seguente codice java.Perché il valore negativo di Integer.MIN_VALUE ha lo stesso valore?

Integer value = Integer.MIN_VALUE; 
System.out.println(value); 

value = -value; 
System.out.println(value); 

uscita

-2147483648 
-2147483648 

Come il valore negativo dei Integer.MIN_VALUE valore risulta lo stesso valore?

Tuttavia, il risultato non può essere 2147483648 poiché il valore massimo di Numero intero in java è 2147483647.

Ma vuoi sapere perché -2147483648? Che tipo di operazioni bit-bit stanno accadendo internamente?

+0

Per gli elettori di riapertura, [questa] (http://stackoverflow.com/a/17256127/438154) risposta nel duplicato spiega la negazione di "Integer.MIN_VALUE".I duplicati non riguardano le domande come le stesse, si tratta di _Questa domanda ha già una risposta qui_, come afferma l'etichetta. –

risposta

10

Che tipo di operazioni bit-bit stanno accadendo internamente?

Java utilizza la rappresentazione two's complement di numeri firmati. Pertanto, il cambiamento di segno operazione, si compone di due fasi:

  1. Invertendo i bit del valore originale, e
  2. Aggiunta 1 al risultato. rappresentazione

s' 2147483648 è mostrato sotto:

10000000000000000000000000000000 

invertente produce

01111111111111111111111111111111 

calcolata 1 rende nuovamente lo stesso numero, cioè

10000000000000000000000000000000 

causa intero finito flusso.

+1

Perché si limita questo a numeri positivi come input? – laune

+0

@laune Capisco cosa intendi. Modificato per evitare la confusione. – dasblinkenlight

+0

@Codebender Il risultato dell'aggiunta di '1' è maggiore di quello che può contenere il valore positivo più alto di' int', quindi si tratta di un overflow. – dasblinkenlight

12

Quando si annulla -2147483648, si risolve in 2147483648, che supera Integer.MAX_VALUE con 1. Quindi il valore trabocca nuovamente a Integer.MIN_VALUE.

Dal JLS:

I tipi integrali sono byte, short, int, e lunga, i cui valori sono 8 bit interi con segno in complemento a due a 64-bit, 16-bit, 32-bit e .

Quindi, ogni operazione unaria eseguita su un numero intero verrà effettivamente applicata alla rappresentazione del complemento a due del numero. Quando viene raggiunto il numero Integer.MAX_VALUE, questo sarà composto da un numero di riferimento 0 e 31 1 bit. Aggiungendo 1 si otterrebbe un numero con uno 1 iniziale e 31 trailing 0 s, che in realtà rappresenta la rappresentazione complementare di due di Integer.MIN_VALUE.

+1

'Quando viene raggiunto il valore Integer.MAX_VALUE sarà composto da 32 1 bit. Aggiungendo 1 si otterrebbe un numero a 33 bit con uno iniziale di 1 e uno zero finale. - Hai sbagliato un po '. Integer.MAX_VALUE è uno 0 seguito da 31 1 bit. Aggiungendone uno ne risulta 1 seguito da 31 0 bit, che è la rappresentazione complementare di due di Integer.MIN_VALUE – Eran