Datentypen Überlauf primitiver Datentypen

SHasteCode

Neues Mitglied
Hallo,

warum wird int= 300 byte = 44 und nicht byte = 45 ?
Meine Rechnung: 300-127 = 173
-128 + 173 = 45
Wo wird der eine Byte noch abgezogen ?
 
int 300 in 32-bit Binärdarstellung = 0b0000_0000_0000_0000_0000_0001_0010_1100
Java macht two's complement narrowing, das heißt wir schauen uns das Vorzeichen von 300 an, was 0 ist. In diesem Fall können wir einfach die überschüssigen Bits von 300 abschneiden und kommen an bei: 0b0010_1100
was dezimal = 44 ist.
Two's complement Darstellung hat auch den Vorteil, dass wir hier allerdings auch immer einfach die Bits abschneiden können.

Siehe: https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.
 
Zuletzt bearbeitet:
Wenn du das korrekte Ergebnis mittels Arithmetik ausrechnen möchtest (und nicht einfach mit Bit-Abgeschneide), benötigst du die Modulo-Operation zu 256. Also 300 % 256 = 44.
Oder anders ausgedrückt: Dividiere 300 durch 256. Das ergibt ganzzahlig abgerundet 1 und es bleibt ein Rest von 44, weil 256 * 1 + 44 = 300.
Interessanterweise gilt für eine Modulo-Operation n % m, bei der m eine Zweierpotenz ist (was 256 ja ist, weil 2^8 = 256), dass n % m == n & (m - 1), wobei & ein bitweises AND ist. Also in unserem Beispiel mit 300 & 255 = 44.
Oder mit anderen Worten: Durch das bitweise AND werden alle höheren Bits abgeschnitten (bzw. auf null gesetzt).
 
int 300 in 32-bit Binärdarstellung = 0b0000_0000_0000_0000_0000_0001_0010_1100
Java macht two's complement narrowing, das heißt wir schauen uns das Vorzeichen von 300 an, was 0 ist. In diesem Fall können wir einfach die überschüssigen Bits von 300 abschneiden und kommen an bei: 0b0010_1100
was dezimal = 44 ist.
Two's complement Darstellung hat auch den Vorteil, dass wir hier allerdings auch immer einfach die Bits abschneiden können.

Siehe: https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3

kompliziert erklärt, aber ich habs verstanden. dachte nur, man könnte das auch ganz "einfach", wie mit meiner Methode berechnen
 

Zurück
Oben