有趣的Int 和位元組轉換異常
在Java 中將int 轉換為byte 時,行為可能看起來出乎意料,特別是考慮到明顯的情況時資料遺失以及分配給結果位元組的負號。為了解開這個謎團,讓我們深入研究原始資料類型和補碼表示法的複雜性。
理解原始型別與補碼:
在 Java 中,int 佔據32位,而一個位元組只佔8位元。此外,像 int 和 byte 這樣的基本型別遵循二進位補碼表示。在此方案中,最高位元 (MSB) 確定符號,附加位元導致其複製。
從 Int 到 Byte 的位元轉換:
當轉換int 到一個位元組,Java 只提取 8 個最低有效位元並相應地分配值。然而,int 的 MSB(現在是位元組的符號位元)在結果中起著重要作用。
揭示隱藏的真相:
讓我們剖析我們的令人困惑的例子:
int i = 132; byte b = (byte)i; // Implicit narrowing conversion System.out.println(b); // Prints -124
的32 位元二進位表示132:
00000000000000000000000010000100
提取8 個最低有效位(10000100):
10000100
轉換為二進位補碼表示:
11111000
Java 將其解釋為由於反轉位模式而產生負值,導致 -124
解謎:
要擷取位元組的原始 8 位元無符號值,我們可以執行位元 AND 運算:
byte signedByte = -124; int unsignedByte = signedByte & 0xff; // 0xff = 11111111b
此操作屏蔽了無關的符號位,產生以下結果結果:
Unsigned value: 10000100 (84 in decimal)
總結技巧:
在int 到byte 轉換期間,Java透過隱性縮小忽略最左邊的24 位。符號位原本是 int 中的第 8 位,現在成為位元組中的 MSB,影響其解釋。要揭示無符號值,需要按位與運算,有效地擦除符號位。
以上是為什麼在 Java 中將 int 轉換為 byte 會產生負值,我們如何檢索原始的無符號值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!