Heim > Java > javaLernprogramm > Hauptteil

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
Freigeben: 2024-11-09 09:10:02
Original
869 Leute haben es durchsucht

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
Nach dem Login kopieren

Die 32-Bit-Binärdarstellung von 132:

00000000000000000000000010000100
Nach dem Login kopieren

Extrahieren der 8 niedrigstwertigen Bits (10000100):

10000100
Nach dem Login kopieren

Konvertieren in die Zweierkomplementdarstellung:

11111000
Nach dem Login kopieren

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
Nach dem Login kopieren

Dieser Vorgang maskiert die überflüssigen Vorzeichenbits und ergibt Folgendes Ergebnis:

Unsigned value: 10000100 (84 in decimal)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage