2012-09-21 10 views
14

Ho un test di domani e Non riesco a capire il mio libri spiegazione, apprezzo l'aiuto:Java interi MIN_VALUE negativo quindi confrontare

public class TestClass{ 
     public static void main(String[] args) throws Exception{ 
      int a = Integer.MIN_VALUE; 
      int b = -a; 
      System.out.println(a+ " "+b); 
     } 
} 

uscita: -2147483648 -2147483648

Perché questa stampa 2 numeri negativi della stessa grandezza e non un positivo e un negativo?

risposta

30

causa di un overflow silenzioso: Integer.MIN_VALUE è -2^31 e Integer.MAX_VALUE è 2^31-1, così -Integer.MIN_VALUE è 2^31, che è Integer.MAX_VALUE + 1, che per definizione è troppo grande per un numero intero. Così trabocca e diventa Integer.MIN_VALUE ...

Si può anche verificare che:

System.out.println(Integer.MAX_VALUE + 1); 

stampe la stessa cosa.

Più tecnicamente, il risultato è definita dalla Java Language Specification #15.18.2:

Se un numero intero di addizione overflow, allora il risultato è il bit meno significativi della somma matematica come rappresentato in qualche sufficientemente grande formato complemento a due . Se si verifica un overflow, il segno del risultato non è uguale al segno della somma matematica dei due valori dell'operando.

+0

Questo è stato veloce e preciso! –

+0

Ah il mio libro mi ha dato una spiegazione in binario, preferisco di gran lunga questa spiegazione che posso capire più facilmente. Molto apprezzato. – Quinma

+1

Un altro modo per realizzare questo problema è quando si usa 'Math.abs()'. 'Math.abs (Integer.MIN_VALUE) == Integer.MIN_VALUE' – whiskeyspider

3

Fondamentalmente, perché Integer.MAX_VALUE è in realtà solo 2147483647, così -Integer.MIN_VALUE, che sarebbe 2.147.483,648 mila, effettivamente fuoriescano dalla capacità della rappresentazione binaria interna di interi. Pertanto, il risultato "loop" torna a Integer.MIN_VALUE o -2147483648.

Se invece si fosse ottenuto long b = -((long)a);, si otterrebbe il risultato previsto.

1

di mostrare questo ancora più chiaramente:

<br> 
Integer.MIN_VALUE is -2^31 = -2147483648<br> 
Integer.MAX_VALUE is 2^31-1 = 2147483647 
/*notice this is 1 less than the negative value above*/ 
<br> 

1Integer.MAX_VALUE non può prendere 2147483648. Questo è un numero troppo grande di Integer di esattamente 1. Questo fa sì che il numero ritorni sulla scala dal valore massimo al punto iniziale, che è il valore minimo.

Problemi correlati