Unerwartetes Verhalten bei der Java-Int-zu-Byte-Konvertierung
Beim Konvertieren einer Ganzzahl (int) in ein Byte (byte) in Java, Es kann zu unerwarteten Ergebnissen kommen. Betrachten Sie den folgenden Code:
int i = 132; byte b = (byte) i; System.out.println(b);
Überraschenderweise ist die Ausgabe nicht 132, sondern -124. Um zu verstehen, warum, müssen wir uns mit der internen Darstellung primitiver Typen in Java befassen.
Vorzeichenbehaftete Zahlen und Zweierkomplement
Ints sind in Java 32-Bit-vorzeichenbehaftet Ganzzahlen, während Bytes 8-Bit-Ganzzahlen mit Vorzeichen sind. Eine ganze Zahl mit Vorzeichen kann sowohl positive als auch negative Werte in der Zweierkomplement-Notation darstellen. In dieser Notation bestimmt das Bit ganz links (MSB) das Vorzeichen der Zahl, wobei 0 positiv und 1 negativ angibt.
Konvertierung von Int in Byte
Wann Bei der Konvertierung von int in byte behält Java das Vorzeichenbit bei und verwirft die restlichen 24 Bits. Das heißt, wenn der int-Wert positiv war, ist auch der resultierende Bytewert positiv. Wenn der int-Wert jedoch negativ war, wie in unserem Beispiel, erscheint der resultierende Bytewert negativ.
Die Zweierkomplementumkehr
Um dieses negative Verhalten zu verstehen, Wir müssen den Zweierkomplement-Inversionsprozess berücksichtigen. Um eine negative Zahl darzustellen, invertiert das Zweierkomplement alle Bits und addiert 1 zum Ergebnis. In unserem Fall ist der int-Wert 132 binär 10000100. Durch Invertieren der Bits und Addieren von 1 erhalten wir 01111011, was in Dezimalschreibweise -124 ist.
Bytewerte ohne Vorzeichen
In unserem Beispiel erwarten wir normalerweise, dass der Bytewert so ist ohne Vorzeichen sein, was uns einen positiven Wert von 132 anstelle von -124 geben würde. Um den vorzeichenlosen Wert aus dem Byte zu erhalten, können wir eine Bitmaske anwenden, die das Vorzeichenbit entfernt und nur die unteren 8 Bits extrahiert.
byte signedByte = -124; int unsignedByte = signedByte & 0xff; System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
Dadurch wird „Signed: -124 Unsigned: 132“ ausgegeben uns den gewünschten vorzeichenlosen Wert.
Das obige ist der detaillierte Inhalt vonWarum führt die Int-zu-Byte-Konvertierung von Java zu einem negativen Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!