Java-L-Nummer (lang) Spezifikation

Es scheint, dass wenn Sie eine Zahl in Java eingeben, der Compiler automatisch liest es als eine ganze Zahl, weshalb, wenn Sie (lang) 6000000000 eingeben (nicht in der ganzen Zahl) wird es beschweren, dass 6000000000 ist keine ganze Zahl. Um dies zu korrigieren, musste ich 6000000000L angeben. Ich habe gerade über diese Spezifikation erfahren.

Gibt es andere Zahlenangaben wie kurz, Byte, Float, Double? Es scheint, als wären diese gut, denn (ich nehme an) wenn du angeben könntest, dass die Zahl, die du eingibst, eine kurze ist, dann müsste Java sie nicht casting – das ist eine Annahme, korrigiere mich, wenn ich falsch liege . Ich würde normalerweise diese Frage selbst suchen, aber ich weiß nicht, wie diese Art von Nummernspezifikation überhaupt genannt wird.

Es gibt spezifische Suffixe für long (zB 39832L ), float (zB 2.4f ) und double (zB -7.832d ).

Wenn es kein Suffix gibt und es ein ganzzahliger Typ ist (zB 5623 ), wird angenommen, dass es ein int . Wenn es kein ganzzahliger Typ ist (zB 3.14159 ), wird angenommen, dass es ein double .

In allen anderen Fällen ( byte , short , char ) benötigen Sie die Besetzung, da es kein spezifisches Suffix gibt.

Die Java-Spezifikation erlaubt sowohl Groß- als auch Kleinbuchstaben-Suffixe, aber die Großbuchstabenversion für long s wird bevorzugt, da der Großbuchstabe L weniger leicht mit einer Zahl 1 zu verwechseln ist als der Kleinbuchstabe l .

Siehe JLS Abschnitt 3.10 für die blutigen Details (siehe Definition von IntegerTypeSuffix ).

Ich hoffe, Sie werden eine leichte Tangente nicht stören, aber dachte, Sie könnten daran interessiert sein zu wissen, dass neben F (für float), D (für double) und L (für long) ein Vorschlag gemacht wurde , Suffixe für byte hinzuzufügen und shortY bzw. S Dies würde es überflüssig machen, bei Verwendung von Literalsyntax für Byte- (oder Kurz-) Arrays in Bytes zu konvertieren. Das Beispiel aus dem Vorschlag zitieren:

WICHTIGER NUTZEN: Warum ist die Plattform besser, wenn der Vorschlag angenommen wird?

Cruddy Code wie

  byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF}; 

kann wie neu codiert werden

  byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy }; 

Joe Darcy beaufsichtigt Project Coin für Java 7 und sein Blog war eine einfache Möglichkeit, diese Vorschläge zu verfolgen.

Dies sind Literale und werden in Abschnitt 3.10 der Java-Sprachspezifikation beschrieben.

Standardmäßig wird jeder Integral-Primitiv-Datentyp (byte, short, int, long) vom Java-Compiler als int- Typ behandelt. Für Byte und Kurz , solange der ihnen zugewiesene Wert in ihrem Bereich liegt, gibt es kein Problem und kein Suffix ist erforderlich. Wenn der dem Byte und dem Short zugewiesene Wert ihren Bereich überschreitet, ist ein expliziter Casting erforderlich.

Ex:

 byte b = 130; // CE: range is exceeding. 

Um dies zu überwinden, führen Sie das Gießen durch.

 byte b = (byte)130; //valid, but chances of losing data is there. 

Im Falle eines langen Datentyps kann der Integer-Wert problemlos akzeptiert werden. Nehmen wir an, wir ordnen wie

 Long l = 2147483647; //which is max value of int 

In diesem Fall ist kein Suffix wie L / l erforderlich. Der Standardwert 2147483647 wird vom Java-Compiler als Int-Typ betrachtet. Das interne Casting wird vom Compiler ausgeführt und int wird automatisch zum Long-Typ hochgestuft.

 Long l = 2147483648; //CE: value is treated as int but out of range 

Hier müssen wir Suffix als L setzen, um das Literal 2147483648 als long type by java compiler zu behandeln.

so endlich

 Long l = 2147483648L;// works fine. 

Es scheint, als wären diese gut zu haben, denn (ich nehme an) wenn du angeben könntest, dass die Nummer, die du eintippst, eine kurze ist, dann müsste Java sie nicht casting

Da das Parsen von Literalen zur Kompilierzeit stattfindet, ist dies in Bezug auf die performance absolut irrelevant. Der einzige Grund, warum Short- und byte Suffixe schön sind, ist, dass es zu einem kompakteren Code führt.

Erwägen:

 long l = -1 >>> 1; 

gegen

 int a = -1; long l = a >>> 1; 

Jetzt würden Sie erwarten, dass Störungscodefragmente der Variablen l denselben Wert geben. Also brauchen wir Ausdruck in int Literalen als int s.