Primitive Datentypen Literal 8072

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?
 
Könnte mir höchstens vorstellen, dass nicht die Dezimalzahl 8072 sondern die Hexadezimalzahl 0x8072 gemeint ist.
Ist aber eher ins blaue geraten.
 
Meines Erachtens gibt es in Java nur zwei Integer-Literale, nämlich long und int, aber nicht short.
Es gibt aber vier Integer Literale in Java. Byte, short, int und long.
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
Danke schön, da steht alles gut zum lesen.
Es ist nicht der Wertebereich maßgeblich, sondern das Suffix (L für long oder kein Suffix für int).
Ok hab alles verstanden danke.
 
Datentypen für Ganzzahlen(integer) sind byte, short, int und long
http://java-samples.com/showtutorial.php?tutorialid=260

byte, short, int und long sind aber keine Literale, sondern Datentypen.
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.

Beispiel 1(ich habe das int durch ein short ersetzt):
Java:
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 );
  }
}
beide Beispiele funktionieren.
kann man in Java int- und long-Literale angeben, aber keine byte- und short-Literale.
Doch kann man! Siehe Beispiel oben. Nur weil man byte und short kaum verwendet, heißt das nicht, dass man das nicht verwenden kann.
 
Zuletzt bearbeitet:
@Antegra Tekkrebell: In deinem Beispiel 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.
 
Aber ist es denn nicht die Aufgabe den Datentyp selbst zu bestimmen? Oder beides, den Datentyp und Wert?
In deiner Ausgangsfrage ging es darum, den Datentyp des gegebenen Literals zu nennen. Deshalb ist 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.
 
Hallo.

Das Thema ist zwar schon älter aber das Problem bleibt.
In meinem Buch steht: (unverändert und auch nicht aus dem Kontext gerissen)

Da mit einem Literal kein Datentyp verbunden ist, muss der Compiler den Datentyp aus der Syntax des Literals ablesen.

Wenn ich aber schreibe: (wie es auch im Buch steht)

double krummeZahl = 47.11;

hat das Literal doch einen Datentyp, steht ja am Anfang der Deklaration.:

double NAMEDERVARIABLE !

Warum also hat ein "Literal" kein Datentyp?

Falls da jemand noch eine Antwort hat:
Danke und Grüße

edit:

oder ist es evtl. so:
da die Zuweisung auf der rechten Seite zuerst ausgeführt wird, der Compiler aber da noch nicht weiß was 47.11 ist? und daher den Datentyp bestimmen muss?!

Ich hoffe mein Satz ist verständlich.
Danke nochmal.

edit1: (nochmal nachgedacht)

oder aber es liegt an der zuerst nur deklarierten variable, später dann definierten. (wobei in Java wohl nicht unterschieden wird)

double krummeZahl;
krummeGahl = 47.11;

hier wäre mir aber nicht ganz klar das der Compiler den datentyp des Literals nicht kennt bzw noch unbekannt ist. Es wird ja von oben nach unten gearbeitet wird.

Danke ein letztes mal.
 
Zuletzt bearbeitet:
Also ich würde sagen, dass da dein Buch schlicht nicht genau genug ist. Denn die Java Language Specification ist da doch recht genau in 3.10:

https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10

So gibt es in der JLS eine klare Menge an Literalen und diesen ist immer ein klarer Typ gegeben.

Bei Integer Literalen ist z.B. klar benannt, wann dies ein long und wann ein int ist.

Damit ist jedem Literal ein Typ zuordnet. Selbst dem Literal null ist ein Typ zugeordnet (null-Type)
 
Hallo @kneitzel
Vielen dank für ihre Antwort.
Ich kann leider nicht beurteilen ob das Buch genau oder ungenau ist. Ich kann mir aber vorstellen, das der Satz (nach reiflicher Überlegung) richtig ist.
Ein Literal allein hat auch kein Datentyp.
Ich glaube mittlerweile das mit dem Satz ein alleinstehendes Literal gemeint war.
Aber ein nettes mir "docs.oracle.com" zu verlinken,. bin leider nicht auf die Idee gekommen dort nachzusehen.
Danke und Grüße
Steffen
 
Ein Literal an sich ist erst einmal nur eine Zeichenkette. Diese wird vom Compiler gelesen und ausgewertet. Wenn der Compiler ein Literal auswertet, dann erfolgt das nach der Java Language Specification und dann kommt da in der Tat ein konstanter Wert raus, der einen Typ hat.

Die Java Language Specification ist bezüglich Java Code sowas wie das Gesetz. Die Spezifikation gibt klare Vorgaben/Regeln vor und im Rahmen dieser Vorgaben/Regeln kann man dann agieren. Wir können also schauen, was dort steht. Dann kann man auch überlegen, ob es eindeutig ist oder nicht. Bezüglich des Typs besagt die Java Language Specification aber:
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).
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.

Generell kann man dies sogar auch im Code testen. Wenn Du etwas hast wie:
Java:
Object obj = 1234;
Dann muss der Compiler das 1234 ja als Literal zu irgendwas auswerten. Wenn er das zu einem primitiven Typ auswertet, dann würde im Rahmen der Zuweisung das Autoboxing stattfinden. Und von obj könnte man sich z.B. die Klasse anzeigen lassen, also etwas machen wie:
Java:
System.out.println(obj.getClass().getSimpleName());

Dadurch würde man dies auch etwas kontrollieren können - so man beim Autoboxing dann nicht irgendwas unterstellt an Vorgängen.
 
Ist zwar nicht mein Thema aber ich muss doch mal fragen:
Was genau soll ein "Literal" sein?
Für mich gibt es Datentypen und die haben feste Bereiche.
Also long, byte, short,int für ganzzahliges.

Aber was soll dieses "Literal" sein?
Nichts für ungut aber klingt für mich nahc so esoterischem Nonsens wie wenn die Amis ankommen mit ihrem "Sex vs gender" und man müsse da interpetierne welches Fabelwesen man genre als geschlecht hätte...
 

Zurück
Oben