Frage von Schrempf94, 37

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

Hallo habe gerade versucht eine Zahl(z.b. 166) mithilfe eines cast operators in eine byte zahl bzw variable umzuwandeln. Mir ist klar dass das nicht funktioniert weil die Zahl für byte zu groß ist aber warum kommt bitte gerade -90 dabei heraus?

Antwort
von Schachpapa, 19

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
Kommentar von ralphdieter ,

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 :-)

Kommentar von Schachpapa ,

Du weißt doch:

Entweder man kann es, dann macht man es.
Oder man kann es nicht, dann lehrt man es.
Oder man kann es nicht lehren, dann geht man ans Seminar und bildet Lehrer aus.

Und jetzt darfst du raten, zu welcher Gruppe ich gehöre ;-)

Antwort
von priesterlein, 31

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
von ralphdieter, 19

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]

Kommentar von Schrempf94 ,

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

Kommentar von ralphdieter ,

Bei der Umwandlung werden alle Binärstellen ab Position 8 abgeschnitten. Formal wird also ein Vielfaches von 2^8=256 abgezogen, sodass ein Wert zwischen -128 und 127 übrig bleibt.

Im Zehnersystem ist das leichter zu erkennen. Stell Dir ein Zählwerk mit 3 Ziffern vor. Man hat sich darauf geeinigt, dass 000..499 die entsprechende positive Zahl bedeutet, und 500..999 die negative Zahl nach Abzug von 1000, also -500..-1.

Schreibst Du nun eine große Zahl in das Zählwerk, bleiben davon nur die letzten 3 Ziffern erhalten. Vielfache von 1000 werden einfach abgeschnitten.

Jetzt kann es passieren, dass von einer ursprünglich positiven Zahl wie 1234567 die letzten 3 Ziffern über 500 liegen und daher als negative Zahl zu lesen sind. "567" bedeutet nach Vereinbarung die Zahl 567-1000=-433.

Umgekehrt kann auch eine große negative Zahl wie 99999999400 (für -600) nach dem Umwandeln positiv wird (400).

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten