意外行為:Java 位元組轉換詢問
在 Java 中,當 int 轉換為 byte 時,會出現 -124的意外結果下面的程式碼片段引起了人們的注意:
int i = 132; byte b = (byte)i; System.out.println(b);
深入探究謎團
要解開這個謎團,我們必須深入研究Java 中原始資料類型的複雜性。整數(32 位元)和位元組(8 位元)的儲存容量不同。大多數原始類型(包括位元組)都是帶符號的,這意味著它們使用二進制補碼編碼來表示正值和負值。
符號位優勢
在二進位補碼中,最有效位元 (MSB) 決定符號。將位元組轉換為 int 時,MSB 將複製到新的 MSB。因此,一個8位元組255(11111111)變成32位元INT 111111111111111111111111110101011。
負欺騙
解釋否定的兩者的補充數字涉及尋找第一個MSB的補充數字從左到右並反轉所有後續位元。對於上面 255 的 int 表示,這會產生 00000000000000000000000001111111 = -1。這解釋了為什麼 Java 顯示 -124,有符號值 132。 揭示無符號真相為了揭示字節的無符號值,我們使用位掩碼( 0xff),隔離最低有效8 位,刪除多餘的符號位元.將此屏蔽操作套用至位元組signedByte = -1 會產生無符號值unsignedByte = 255。 按位魔法按位AND 屏蔽掉不必要的符號位。當 int 轉換為 byte 時,Java 會丟棄前 24 位元。遮罩確保剩餘的 8 位元被 Java 解釋為正值,因為符號位元現在為 0。 揭開字節的陰謀此行為突出顯示數字的有符號和無符號表示之間的關鍵區別以及數據類型轉換期間起作用的位級操作。透過理解這些原理,我們可以破解 Java 中位元組轉換的難題並避免意外的結果。
以上是為什麼在 Java 中將 `int` 轉換為 `byte` 會導致意外的負面結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!