ich wurd gebeten nochmal kurz zu erklären wie das in Aufgabe 4a genau funktioniert.
Das Verhalten von Java ist eigentlich relativ offensichtlich wenn man sich überlegt was da intern passiert:
Die Zahlen werden als 2er-Komplement dargestellt und dann addiert (also einmal +1 und einmal + (-1))
- Code: Alles auswählen
"zahl" im 2K sieht also so aus
10000000000000000000000000000000
und die +1 so
00000000000000000000000000000001
das wird addiert und raus kommt
10000000000000000000000000000001
als 2K-Darstellung des Ergebnisses, invertieren und addieren von 1 liefert dann die "normale" Binärdarstellung
01111111111111111111111111111111.
das Ergebnis ist also diese Zahl als dezimal interpretiert plus die Vorzeicheninformation aus dem 2K, also - 2147483647
Soweit ja noch nix spannendes. Jetzt addieren wir aber nicht +1 sondern -1:
- Code: Alles auswählen
"zahl" im 2K sieht wieder so aus
10000000000000000000000000000000
und die -1 so
11111111111111111111111111111111
das wird addiert und raus kommt (Der Übertrag der an der linkesten Stelle entseht wird einfach ignoriert)
01111111111111111111111111111111
als 2K-Darstellung des Ergebnisses.
Hier sehen wir das durch den ignorierten Übertrag sozusagen Informationen verloren geht (hätten wir mehr Bits zur Verfügung wär das nicht
passiert). Damit ist aber das msb (most significant bit - Bit mit der höchsten Wertigkeit, also das ganz links) nun 0. Also müssen wir zum
berechnen der Dezimaldarstellung nichts mehr machen sondern die Zahl einfach "wie sie ist" interpretieren und raus kommt nunmal
2^0+2^1+2^2+...2^30 = 2147483647.
In Aufgabe 5b sind die Zahlen dementsprechend dann natürlich auch als int zu betrachten. Wenn man die als long o.ä. sehen wollen würde müsste man das explizit casten.