2015-11-17 1 views
21

Ich initialisiere zwei Ganzzahlen a und b.Integer in Klammern mit Kompilierungsfehler

Es kompiliert für a, aber es gibt einen Fehler für b.

public class Main_1 { 
    public static void main(String[] args) { 
     int a = -2147483648; //Working fine 
     int b = -(2147483648); //Compilation error: The literal 2147483648 of type int is out of range 
    } 
} 

Warum ist das so?

+34

Der Compiler-Fehler gibt einen Hinweis auf diesen einen, nicht wahr? –

+0

Nein, es ist kein Hinweis, es ist ein Fehler ... :) –

Antwort

50

Der Grund dafür ist, dass der int Datentyp gültige Werte im Bereich [-2147483648, 2147483647] hat. Wenn Sie 2147483648 in Klammern umbrechen, wird daraus ein Ausdruck, der als int ausgewertet wird. Allerdings ist 2147483648 zu groß, um in eine int (zu groß von eins) zu passen.

Das Problem tritt nicht für -2147483648 auf, weil es ein gültiger int Wert ist.

Relevante Teile des JLS:

  • Zugabe Klammern schaffen ein "Klammerausdrücken" (section 15.8.5)
  • eine ganze Zahl literal, wie 2147483648 als int standardmäßig behandelt wird (section 3.10.1)

    Ein Integer-Literal ist vom Typ long, wenn es mit einem ASCII-Buchstaben L oder l (ell) suffi- ziert ist; ansonsten ist es vom Typ int (§4.2.1).

+0

Wenn der Ausdruck int wird. Dann, warum der deklarierte int funktioniert gut. –

+10

@ShowStopper Schau es dir so an: '-2147483648' ist gültig, es ist der min Wert. Wenn man jedoch '- (2147483648)' schreibt, muss zuerst '2147483648' als' int' ausgewertet werden (wegen der Klammern), aber das ist zu groß um 1. – Tunaki

+0

Danke @Tunaki also, was ich verstehe, sind Klammern sind Teil von Integer und werden im Ganzzahlbereich um –

11

int Werte gehen von -2147483648 zu 2147483647. So ist -(2147483648) OutOfRange, weil der Wert innerhalb der Klammern als int ausgewertet wird. Der maximale Wert, den Sie in die Klammer setzen können, ist

Integer.MAX_VALUE //Which is equals to 2147483647 
4

Max Wert von int 2147483647 und min-Wert von int ist -2147483648. Aber wenn Sie 2147483648 in geschweifte Klammern setzen es zunächst als +2147483648 betrachten und es ist nicht gültig für int.

1

int Datentyp ist ein 32-bit signed two's complement integer.

Minimalwert ist - 2,147,483,648.(-2^31)

Maximalwert 2,147,483,647(inclusive).(2^31 -1)

7

Der Kompilierungsfehler ist ziemlich klar: Sie int wörtlichen verwenden, die außerhalb des Bereichs liegt.Wenn Sie es wirklich tun möchten, können Sie long wörtlichen verwenden:

int b = (int) -(2147483648L); 

Oder double wörtliche:

int b = (int) -(2147483648.0); 
2

Ein guter Weg, dies zu visualisieren, ist bei (int) -(2147483648) wie aussehen:

(int) -1 * (2147483648) 

Wenn dies vom Compiler ausgewertet wird, heißt es, ich muss zuerst die Zahl in Klammern in eine ganze Zahl umwandeln, dann multipliziere das mit negativem 1. Dann proce eds, um eine Bereichsüberprüfung der Nummer durchzuführen und stellt fest, dass sie größer ist als das, was in eine Ganzzahl (2147483648) passen kann, was der Kompilierungsfehler ist.