2012-09-21 21 views
14

mam egzamin jutro i nie mogę zrozumieć moje książki wyjaśnienie, doceniam pomoc:Java Integers MIN_VALUE ujemny następnie porównać

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

wyjściowa: -2147483648 -2147483648

Dlaczego ten druk 2 negatywne numery tej samej wielkości, a nie pozytywnej i negatywnej?

Odpowiedz

30

Ponieważ cichego całkowitej przelewu: Integer.MIN_VALUE jest -2^31 i Integer.MAX_VALUE jest 2^31-1 tak -Integer.MIN_VALUE jest 2^31, która jest Integer.MAX_VALUE + 1, który z definicji jest zbyt duża dla całkowitej. Więc to przelewa i staje Integer.MIN_VALUE ...

Można również sprawdzić, czy:

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

drukuje to samo.

technicznie bardziej wynik jest określony przez Java Language Specification #15.18.2:

JEŻELI przepełnienia addycyjnych całkowitą, to wynikiem jest znaczące bity od sumy matematycznej, jak pokazano w jakimś dostatecznie dużym formacie uzupełnienie do dwóch . Jeśli wystąpi przepełnienie, wówczas znak wyniku nie jest tym samym, co znak matematycznej sumy dwóch wartości operandu.

+0

To było szybkie i precyzyjne! –

+0

Ah moja książka dała mi wyjaśnienie w formie binarnej, wolę to wyjaśnienie, które łatwiej rozumiem. Bardzo doceniane. – Quinma

+1

Innym sposobem na rozwiązanie tego problemu jest użycie 'Math.abs()'. 'Math.abs (Integer.MIN_VALUE) == Integer.MIN_VALUE' – whiskeyspider

3

Zasadniczo, ponieważ Integer.MAX_VALUE jest faktycznie tylko 2147483647, więc -Integer.MIN_VALUE, co byłoby +2147483648, rzeczywiście przelewa potencjału wewnętrznego binarnej reprezentacji liczb całkowitych. Tak więc wynik "loopuje" z powrotem do Integer.MIN_VALUE lub -2147483648.

Jeśli zamiast tego zrobiłeś long b = -((long)a);, uzyskasz oczekiwany wynik.

1

Aby to pokazać jeszcze wyraźniej:

<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 nie może wziąć 2147483648. To jest zbyt duża liczba dla Integer dokładnie 1. Powoduje to, że liczba wraca na skali od wartości maksymalnej do początkowej, która jest wartością minimalną.