Slide " primitive literals"





  • Warum gibt es keine Literale für byte und short ? (Tabelle in dieser Zeile leer)





  • @Dr-Martin-Goik Warum gibt es dann byte und short wenn diese Typen von der JVM überhaupt nicht "verstanden" und genutzt werden ? (wie es in dem verlinkten Forum beschrieben wird)

    In Budi Kurniawan's Buch steht außerdem, dass es short und byte Literale geben würde:
    "Integer literals are used to assign values to variables of types byte, short, int, and long."

    Oder hab ich da was komplett falsch verstanden ?



  • @Schilling

    Warum gibt es dann byte und short wenn diese Typen von der JVM überhaupt nicht "verstanden" und genutzt werden ? (wie es in dem verlinkten Forum beschrieben wird)

    Kleiner Skriptvorgriff: Der Artikel im Forum bezieht sich auf (arithmetische) Operationen, nicht auf das Speichern von Daten. In Figure 140. No binary + operator yielding byte finden Sie die Information, dass es in Java keinen »+« Operator gibt, welcher zwei byte Werte zu einem byte addiert: Ein byte + byte Ausdruck liefert einen int. In Figure 140 ist ein Link angegeben, welcher erläutert, dass dies eine Design Entscheidung der JVM Entwickler ist, um die Anzahl sogenannter Opcodes so zu begrenzen, dass jeweils ein Byte zur Auswahl einer Operation ausreichend ist. Dies wäre nicht möglich, wenn man alle Typ/Operator Kombinationen, wie z.B. byte + byte ergibt byte, zuließe.

    In Budi Kurniawan's Buch steht außerdem, dass es short und byte Literale geben würde:
    ">Integer literals are used to assign values to variables of types byte, short, int, and long."

    Oder hab ich da was komplett falsch verstanden ?

    Soweit würde ich doch niemals gehen 😉 . Aber Sie haben aus dem Satz eine falsche Schlussfolgerung gezogen: Übersetzung: Es werden Integer Literale verwendet, um Werte an Variablen vom Typ byte, short, int, und long zuzuweisen. Das heißt aber nicht, dass es für alle vier Typen von Variablen auch korrespondierende Literale gibt.

    Dies ist gerade nicht der Fall. Es gibt in Java lediglich zwei ganzzahlige und zugleich vorzeichenbehaftete Literale, nämlich vom Typ int und long. Diese kann man mit Einschränkungen an Variablen anderer Typen zuweisen, wobei eine Typumwandlung (narrowing) erfolgt, falls es vom Wert her ohne Datenverlust passt:

    byte b = 127;  // Geht ohne Cast b = (byte) 127;
    

    Diese Zuweisung ist vom Typkonzept her unzulässigt, denn 127 ist ein int Literal und kann ohne eine Cast Operation nicht an eine Variable vom »kleineren« Typ byte zugewiesen werden. Weil aber 127 ein konstanter Wert ist, prüft der Compiler zur Übersetzungszeit, ob selbiger im Wertebereich einer byte Variablen liegt. Da dies (gerade noch) der Fall ist, braucht man keinen Cast.

    Eine Verletzung des Wertebereichs führt hingegen zu einem Compile Time Fehler:

     byte b = 128;  // Wertebereich -128,...,0,...,127 überschritten, Error »Required type: byte Provided:int«
    


  • Alles klar, jetzt verstehe ich es. Vielen Dank für die ausführliche Antwort ! 🙂


Log in to reply