Exercise "Adding values "





  • Soweit ist mir die Problematik klar! Bei der ersten Ausgabe wird das Ergebnis des Ausdrucks als Int ausgegeben, da beide Ganzahlen von Java automatisch als int definiert werden. Dies führt dann zum Overflow, da der maximal darstellbare Zahlenbereich überschritten wird. Bei der zweiten Ausgabe wird das Ergebnis als "long" ausgegeben, da die 1L im Ausdruck als long definiert wurde. Damit stehen mehr bytes zur Verfügung und die Ausgabe kann korrekt dargestellt werden.

    Um das ganze in der Konsole übersichtlicher zu machen habe ich kurz folgendes hinzugefügt:

    System.out.println("value1 " + 2147483647 + 1);
    System.out.println("value2 " + 2147483647 + 1L);

    Nun gibt mir die Konsole allerdings folgende Werte aus:

    value1 21474836471
    value2 21474836471

    Wie kommt das? Wird hier der Operator falsch verwendet? Bzw. warum werden die Werte verkettet und nicht addiert? Freue mich auf/über Aufklärung!



  • @Sendelbach
    Sie haben z.B. in der zweiten Ausgabe folgende Struktur:

    System.out.println(String + int + long);
    

    Der Ausdruck aus einem String, einem int und einem long Wert getrennt durch zwei + Operatoren wird von links nach rechts bewertet. Bei dem linken Ausdruck der Form String + int wird zunächst der int Operand in einen String umgewandelt. Danach werden beide Strings verkettet:

    "value1 " + 2147483647 --> "value1 " + "2147483647" --> "value1 2147483647"

    Dieser String wird dann durch den zweiten + Operator nach dem gleichen Muster mit dem long Literal 1L verkettet:
    "value1 2147483647" + 1L --> "value1 2147483647" + "1" --> "value1 21474836471"

    Für das gewünschte Ergebnis müssen Sie diese sogenannte Linksassoziativität der beiden + Operatoren durch Setzen von Klammern aufheben:

    System.out.println("value1 " + (2147483647 + 1));
    System.out.println("value2 " + (2147483647 + 1L));
    

    Dies liefert dann das Erwartete:

    value1 -2147483648
    value2 2147483648
    


  • @Dr-Martin-Goik
    Vielen Dank für die schnelle und hilfreiche Aufklärung! Habe es jetzt verstanden.


Log in to reply