2012-09-21 11 views
14

ich einen Test morgen und ich kann meine Bücher Erklärung verstehen, ich schätze die Hilfe:Java Integers MIN_VALUE negativ dann vergleichen

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

Ausgang: -2147483648 -2147483648

Warum ist dieser Druck 2 negative Zahlen der gleicher Größe und nicht positiv und negativ?

Antwort

30

Wegen silent ganzzahligen Überlauf: Integer.MIN_VALUE ist -2^31 und Integer.MAX_VALUE2^31-1 ist, so ist -Integer.MIN_VALUE2^31, die Integer.MAX_VALUE + 1 ist, die definitionsgemäß für eine ganze Zahl zu groß ist. So ist es überläuft und wird Integer.MIN_VALUE ...

Sie können auch, dass der Check:

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

druckt dasselbe.

Technisch wird das Ergebnis durch die Java Language Specification #15.18.2 definiert ist:

Wenn ein Integer zusätzlich überläuft, dann ist das Ergebnis die Bits niedriger Ordnung der mathematischen Summe als in irgendeiner ausreichend großen Zweierkomplement-Format dargestellt . Wenn ein Überlauf auftritt, ist das Vorzeichen des Ergebnisses nicht dasselbe wie das Vorzeichen der mathematischen Summe der beiden Operandenwerte. Grundsätzlich

+0

Das war schnell und präzise! –

+0

Ah mein Buch gab mir eine Erklärung in Binärform, ich bevorzuge diese Erklärung, die ich leichter verstehen kann. Sehr geschätzt. – Quinma

+1

Eine andere Möglichkeit, dieses Problem zu beheben, ist die Verwendung von 'Math.abs()'. 'Math.abs (Integer.MIN_VALUE) == Integer.MIN_VALUE' – whiskeyspider

3

, da eigentlich nur Integer.MAX_VALUE 2147483647 ist, so -Integer.MIN_VALUE, die 2147483648 wäre, überläuft tatsächlich die Kapazität der internen binären Darstellung von ganzen Zahlen. Somit "springt" das Ergebnis zurück zu Integer.MIN_VALUE oder -2147483648.

Wenn Sie stattdessen long b = -((long)a); hätten, würden Sie das erwartete Ergebnis erhalten.

1

dies zu zeigen, sogar deutlich:

<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_VALUE2147483648 nicht stattfinden kann. Dies ist eine zu große Zahl für Integer um genau 1. Dies bewirkt, dass die Zahl auf der Skala vom Maximalwert zurück zum Startpunkt geht, was der Minimalwert ist.