Ich bin beim online Vokabeltraining über primitive Datentypen. Bei der Frage Welchen Datentyp hat das Literal: 8072 ? kommt die Antwort int raus. Ich hätte short eingegeben weil es ja deutlich im Wertebereich liegt, warum also int?
Es ist nicht der Wertebereich maßgeblich, sondern das Suffix (L für long oder kein Suffix für int). Wenn ein int-Literal zu groß für den Wertebereich ist, wird es nicht automatisch zu einem long-Literal, sondern es ist dann eben ein ungültiges int-Literal.Ich hätte short eingegeben weil es ja deutlich im Wertebereich liegt, warum also int?
Es gibt aber vier Integer Literale in Java. Byte, short, int und long.Meines Erachtens gibt es in Java nur zwei Integer-Literale, nämlich long und int, aber nicht short.
Danke schön, da steht alles gut zum lesen.An integer literal is of type long if it ends with the letter L or l; otherwise it is of type int.
aus:
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Ok hab alles verstanden danke.Es ist nicht der Wertebereich maßgeblich, sondern das Suffix (L für long oder kein Suffix für int).
byte, short, int und long sind aber keine Literale, sondern Datentypen. Wie man dem Link von @fhoffmann entnehmen kann, kann man in Java int- und long-Literale angeben, aber keine byte- und short-Literale.Es gibt aber vier Integer Literale in Java. Byte, short, int und long.
Genau, primitive Datentypen. Und Literale repräsentieren selbst einen Wert. Und byte, short, int und long kann man für Integer-Literale verwenden. Oder korrigiere mich wenn ich falsch liege.byte, short, int und long sind aber keine Literale, sondern Datentypen.
public class Beispiel
{
public static void main ( String[] args )
{
[B]short[/B] lohnbetrag = 22500; //Ganzzahlliteral
System.out.println("Die Variable enthaelt: " + lohnbetrag );
}
}
Beispiel 2(ich habe das int durch ein byte ersetzt):
public class Beispiel
{
public static void main ( String[] args )
{
byte lohnbetrag = 125; //Ganzzahlliteral
System.out.println("Die Variable enthaelt: " + lohnbetrag );
}
}
Doch kann man! Siehe Beispiel oben. Nur weil man byte und short kaum verwendet, heißt das nicht, dass man das nicht verwenden kann.kann man in Java int- und long-Literale angeben, aber keine byte- und short-Literale.
Es gibt *nur* Integer und Long-Literale. Nur weil man byte und short trotzdem zuweisen kann, heißt das nicht, dass die Literale von diesem Typ sind.Doch kann man! Siehe Beispiel oben. Nur weil man byte und short kaum verwendet, heißt das nicht, dass man das nicht verwenden kann.
Aber ist es denn nicht die Aufgabe den Datentyp selbst zu bestimmen? Oder beides, den Datentyp und Wert?Es gibt *nur* Integer und Long-Literale. Nur weil man byte und short trotzdem zuweisen kann, heißt das nicht, dass die Literale von diesem Typ sind.
Von wem die Aufgabe?Aber ist es denn nicht die Aufgabe den Datentyp selbst zu bestimmen? Oder beides, den Datentyp und Wert?
byte lohnbetrag = 125;
erkennt der Compiler, dass das Literal 125 vom Datentyp int
ist, für die Zuweisung zu lohnbetrag
aber der Datentyp byte
benötigt wird. Der Compiler führt deshalb eine Konvertierung von int
in den Zieldatentyp byte
durch. Das was lohnbetrag
da zugewiesen wird, ist also schon nicht mehr das ursprüngliche Literal, sondern das Ergebnis einer impliziten Weiterverarbeitung des Compilers. Solche Konvertierungen sind nicht immer möglich, hier geht es aber. Entsprechend auch bei deinem short
-Beispiel.In deiner Ausgangsfrage ging es darum, den Datentyp des gegebenen Literals zu nennen. Deshalb istAber ist es denn nicht die Aufgabe den Datentyp selbst zu bestimmen? Oder beides, den Datentyp und Wert?
int
die richtige Antwort. Man könnte auch danach fragen, welchen Datentyp man mindestens benötigt, um den gegebenen Wert zu speichern. Dann wäre short
die richtige Antwort gewesen.Damit ist dem Integer Literal aus meiner Sicht ein klarer Typ zugewiesen und ich sehe hier derzeit schlicht keinen Spielraum - unabhängig was da in irgendwelchen Büchern steht oder was andere für gut / besser halten würden.An integer literal is of type long if it is suffixed with an ASCII letter L or l (ell); otherwise it is of type int (§4.2.1).
Object obj = 1234;
System.out.println(obj.getClass().getSimpleName());
Einfacher sogar noch mit jshell:Generell kann man dies sogar auch im Code testen.
jshell> 1
$1 ==> 1
jshell> 1L
$2 ==> 1
jshell> 1.0
$3 ==> 1.0
jshell> 1.0F
$4 ==> 1.0
jshell> /vars
| int $1 = 1
| long $2 = 1
| double $3 = 1.0
| float $4 = 1.0
Was genau soll ein "Literal" sein?
Neben dem Wikipedia-Link findet man die Erläuterung kurz und prägnant eben auch in der bereits verlinkten Java Language Specification im Kapitel 3.10:Aber was soll dieses "Literal" sein?