Warum kommt bei einem cast einer zu großen zahl für byte Müll raus?

... komplette Frage anzeigen

3 Antworten

Das ist in der Sprachdefinition exakt aufgeschrieben:

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.

Frei übersetzt:

Eine verkleinernde Umwandlung von signed integer zu einem ganzzahligen Typ T wirft einfach alle außer den n niederwertigsten Bits weg, wobei n die Anzahl der für T benötigten Bits ist. Zusätzlich zum möglichen Verlust der Information über die Größe kann sich dabei auch das Vorzeichen des Ergebnisses gegenüber dem der Eingangsgröße ändern.

Wenn man das weiß, kann man sich darauf einstellen. Es ist klar dokumentiert und nicht in jedem Dialekt und auf jeder Plattform anders.

Ob man das gut findet, ist eine andere Sache. Ich beschwere mich auch nicht, dass ein Ferrari keine Anhängerkupplung hat.

int  166 = 00000000 00000000 00000000 10100110
byte -90 = 10100110
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von ralphdieter
26.05.2016, 16:26

Pfui, Du schummelst und liest die offizielle Doku! Das geht ja mal gar nicht.

Als echter Java-Profi musst Du so lange in Eclipse herumklicken, bis die roten Symbole verschwunden sind. Doku lesen und Nachdenken kostet nur Zeit und verhindert sichere "Folgeaufträge" (Bug-Fixes).

Wenn Dein Chef davon erfährt, gibt's bestimmt 'ne Abmahnung :-)

0

Das ist der Rest modulo 256, im Bereich -128..127. Beispiele:

byte(166) == -90 [+1·256]
byte(25605) == 5 [+100·256]
byte(2559998) == -2 [+10000·256]

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Schrempf94
26.05.2016, 15:52

inwiefern modulo? habe ja nichts geteilt sondern nur subtrahiert? sry könnte ne dumme frage sein bin kein kerninformatiker ;)

0

Das Vorzeichenbit ist gesetzt, daher negativ. Man muss immer schauen, was an Bitmuster vorliegt und dann, wenn man so etwas vermeiden will, entweder einen unsigned Datentyp nehmen, aber java, haha, die Spaßsprache, oder die Grenzen abfragen und dann auf die Grenze setzen.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?