2009-04-20 8 views
74

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

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 werfen - 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.

Antwort

143

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

Wenn kein Suffix vorhanden ist und ein integraler Typ ist (z. B. 5623), wird angenommen, dass es sich um einen int handelt. Wenn es kein integraler Typ ist (z. B. 3.14159), wird angenommen, dass es sich um einen double handelt.

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

Die Java-Spezifikation ermöglicht sowohl Groß- und Kleinschreibung Suffixe, aber die obere Gehäuseversion für long s wird bevorzugt, da das obere Gehäuse L ist weniger leicht l mit einer Ziffer 1 als der untere Fall zu verwechseln.

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

+7

Spät Eintrag: potentielle Quellen von Mehrdeutigkeit zu entfernen, ist immer gut, und * Ich bin nicht einverstanden nicht * ... aber ich glaube, wenn Sie sich verwirrend '1' mit 'l' und '0' mit' O' (und so weiter), Ihre * Priorität * ist, die Schriftart richtig einzustellen (wenn Sie können), dann sorgen Sie sich um sicherzustellen, dass Sie die Umschalttaste nicht verpassen. – davidcesarino

+0

@SimonNickerson Ich habe eine Frage zu Suffixen ... Wenn ich eine _long_ oder eine _double_ Variable deklariere wie: 'long _lo = 30;' und nicht '30L' bedeutet das, dass meine Variable in _float_ umgewandelt wird? Oder im Falle von '_lo = _lo + 2.77' wird' _lo' in _float_ geworfen, obwohl es als _long_ – luigi7up

+0

Nein erklärt wurde, sind Floats hier nicht beteiligt. Im ersten Fall ist "30" ein "int", das automatisch über eine Erweiterungskonvertierung in eine "lange" umgewandelt wird.Im zweiten Fall ist Ihre Aussage illegal. Sie müssten die rechte Seite explizit zu lange z. '_lo = (lang) (_lo + 2.77)' –

0

Bedenken Sie:

long l = -1 >>> 1; 

gegen

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

Jetzt würde man erwarten, dass Code-Fragmente stören den gleichen Wert Variable l zu geben. Also müssen wir Ausdruck auf int Literale als int s durchgeführt werden.

12

Ich hoffe, dass Sie nicht eine leichte Tangente dagegen, aber haben Sie interessiert sein zu wissen, dass neben F (für Schwimmer), D (für Doppel) und L (lange), a proposal has been made Suffixe hinzufügen für byte 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. Zitieren des Beispiels aus dem Vorschlag:

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

cruddy Code wie

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

als

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

Joe Darcy beaufsichtigt Projekt Münze für Java 7 umcodiert werden und his blog hat eine einfache Möglichkeit, diese Vorschläge zu verfolgen.

+0

das wäre nett ... Ich habe immer festgestellt, dass alle Casts wirklich nervig sind – jbu

+0

Ich nehme an, das hat es nicht in Java 7 geschafft. Irgendein Wort auf, wenn es in ein zukünftiges Update oder Java 8 kommen wird? – crush

+0

@crush Ich habe vor ein paar Monaten versucht, einen Blick darauf zu werfen, und soweit ich das beurteilen konnte, wurde der Vorschlag aufgegeben. Wir haben jedoch _ in numerischen Literalen und das "0b" -Präfix für binäre Literale erhalten. Whoop. – erickson

1

Es scheint, wie diese wäre gut zu haben, weil (ich nehme an), wenn Sie die Nummer angeben, können Sie in gerade Text eingeben ist ein kurzer dann java nicht gegossen hätte es

Da das Parsen von Literalen zum Zeitpunkt der Kompilierung stattfindet, ist dies in Bezug auf die Leistung absolut irrelevant. Der einzige Grund, short und byte Suffixe zu haben, wäre nett, dass es zu kompakterem Code führt.

3

Standardmäßig wird jeder Integral-Primitiv-Datentyp (byte, short, int, long) als int type by java compiler behandelt. Für Byte und short, solange der Wert zugewiesen ist in ihrem Bereich, gibt es kein Problem und kein Suffix erforderlich. Wenn der Wert Byte und short ihren Bereich überschreitet, ist eine explizite Typumwandlung erforderlich.

Ex:

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

zu überwinden diese Art Gießen auszuführen.

Im Falle eines langen Datentyps kann der Ganzzahlwert problemlos akzeptiert werden. Angenommen, wir ordnen wie

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 brauchen wir Suffix als L setzen die wörtliche 2147483648 so lange Art von Java-Compiler zu behandeln.

so schließlich

Long l = 2147483648L;// works fine.