Faszinierende Int- und Byte-Konvertierungsanomalien
Bei der Konvertierung eines Ints in ein Byte in Java kann das Verhalten unerwartet erscheinen, insbesondere wenn man das Offensichtliche berücksichtigt Datenverlust und das dem resultierenden Byte zugewiesene negative Vorzeichen. Um dieses Rätsel zu lösen, wollen wir uns mit den Feinheiten primitiver Datentypen und der Zweierkomplementdarstellung befassen.
Primitive Typen und Zweierkomplement verstehen:
In Java belegt ein int 32 Bit, während ein Byte lediglich 8 Bit belegt. Darüber hinaus folgen primitive Typen wie int und byte der Zweierkomplementdarstellung. In diesem Schema bestimmt das höchste Bit (MSB) das Vorzeichen, und zusätzliche Bits führen zu seiner Replikation.
Bitweise Konvertierung von Int in Byte:
Bei der Konvertierung von an int in ein Byte umwandelt, extrahiert Java nur die 8 niedrigstwertigen Bits und weist den Wert entsprechend zu. Allerdings spielt das MSB eines Int, jetzt das Vorzeichenbit des Bytes, eine wichtige Rolle für das Ergebnis.
Enthüllung der verborgenen Wahrheit:
Lassen Sie uns unsere analysieren verblüffendes Beispiel:
int i = 132; byte b = (byte)i; // Implicit narrowing conversion System.out.println(b); // Prints -124
Die 32-Bit-Binärdarstellung von 132:
00000000000000000000000010000100
Extrahieren der 8 niedrigstwertigen Bits (10000100):
10000100
Konvertieren in die Zweierkomplementdarstellung:
11111000
Java interpretiert dies als Negativer Wert aufgrund des invertierten Bitmusters, was zu -124 führt gedruckt.
Das Rätsel lösen:
Um den ursprünglichen 8-Bit-Wert des Bytes ohne Vorzeichen abzurufen, können wir eine bitweise UND-Operation ausführen:
byte signedByte = -124; int unsignedByte = signedByte & 0xff; // 0xff = 11111111b
Dieser Vorgang maskiert die überflüssigen Vorzeichenbits und ergibt Folgendes Ergebnis:
Unsigned value: 10000100 (84 in decimal)
Zusammenfassung des Tricks:
Während der Int-zu-Byte-Konvertierung ignoriert Java die am weitesten links stehenden 24 Bits durch implizite Verengung. Das Vorzeichenbit, ursprünglich das 8. Bit im int, wird zum MSB im Byte und beeinflusst dessen Interpretation. Um den vorzeichenlosen Wert aufzudecken, ist eine bitweise UND-Verknüpfung erforderlich, wodurch die Vorzeichenbits effektiv gelöscht werden.
Das obige ist der detaillierte Inhalt vonWarum führt die Konvertierung eines int in ein Byte in Java zu einem negativen Wert und wie können wir den ursprünglichen Wert ohne Vorzeichen abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!