Anfänger: Ausgabe kommt minus raus?

ruuckiii

Mitglied
Hallo Leute,

bin neu in der Java-Welt und hoffe, dass ihr mir helfen könnte!

Die Aufgabe lautet:

Geben ist der nachfolgende Code. Welches Ergebnis ist zu erwarten? Begründen Sie Ihr Ergebnis.

System.out.println(2147483647 + 1);


Wieso ist nun das Ergebnis "-2147483648"?

LG
 
Um das zu verstehen wäre als erstes wichtig: Was sind denn 2147483647 und 1?
Wenn Du da verstanden hast, was da der Typ ist und so, dann kann man überlegen, was denn da für Werte gespeichert sein können, d.h. den Wertebereich kann man sich anschauen.
Ebenso kann man sich anschauen, wie die Werte gespeichert werden um im Detail zu verstehen, was dieses +1 macht.

Kannst Du an Hand dieser Fragen das für Dich erarbeiten? (Dadurch bekommst Du den besten Einblick und das beste Verständnis)
 
Vielleicht als weiterer, experimenteller Ansatz: Was ist denn, wenn Du da das Ergebnis selbst ausführst und schreibst:
System.out.println(2147483648);

Funktioniert das? Wenn nicht: Was ist da das Problem?
 
Hat es was dem Datentypen zutun?

Da dieser wohl bei der Größe bis 2147483648 direkt ins minus und ein int ja z.B. nur bis 2147483647 geht...

Aber warum ist das bei der Ausgabe jetzt so wichtig? Woher weiß der Interpreter was für einen konkreten Datentypen ich meine wenn ich es in "System.out.println" eingebe? Könnte doch auch jetzt sein - da ich mit der Zahl einen long-Datentypen meine.
 
Hat es was dem Datentypen zu tun?
Ja.
Da dieser wohl bei der Größe bis 2147483648 direkt ins minus und ein int ja z.B. nur bis 2147483647 geht...
Nennt man "Überlauf". Siehe auch Zweierkomplement.
Könnte doch auch jetzt sein - das ich mit der Zahl einen long-Datentypen meine.
Wenn du ein long-Literal haben möchtest, dann musst du das explizit angeben mit 2147483648L
 
Zuletzt bearbeitet:
Generell nennt man Konstanten im Source Code Literale. Und da gibt es in Java klare Regeln. Diese sind in der Java Language Specification festgelegt: https://docs.oracle.com/javase/specs/jls/se17/html/jls-3.html#jls-3.10
Dies sollte man sich einmal anschauen und verstehen, da dies immer wieder gebraucht wird. Grobe Zusammenfassung, die aber stark vereinfacht ist und nicht alles abdeckt:

- Integer Literale: Alle Zahlen ohne Punkt sind vom Typ int. Wenn ein L angehängt wird, ist es ein long.
- Gleitkomma-Zahlen: Alle Zahlenmit einem . sind vom Typ double. Wenn ein f angehängt wird, ist es ein float.
- Boolean Literale: true und false
- Character Literale: diese werden in einfache Anführungszeichen gesetzt und dürfen nur ein Zeichen enthalten
- String Literale: doppelte Anführungszeichen
- null Literal: null

Dann sind da noch so Dinge erläutert wie Escape Character oder ganz neu: Text Blocks.

==> Auf jeden Fall selbst lesen und ruhig selbst eine Zusammenfassung schreiben. Denn das ist eine stark vereinfachte Darstellung und Du kannst halt auch Integer Zahlen in hexadezimalform angeben oder Gleitkomma Zahlen in Exponentenschreibweise nur um Beispiele zu nennen.
 
Die Zusammenfassung der Antwort, die dein Lehrer haben will, ist der "Überlauf" des Signed Integer, wie von temi genannt.

Ich kann mich noch an meine Schulzeit erinnern, als mir fast die gleiche Frage zu 32767 gestellt wurde. Kinder, wie die Zeit vergeht ...
 

Zurück
Oben