Heim  >  Artikel  >  Java  >  Warum 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?

Warum 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?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 09:10:02838Durchsuche

Why does converting an int to a byte in Java result in a negative value, and how can we retrieve the original unsigned value?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn