首頁 > Java > java教程 > 為什麼在 Java 中將 int 轉換為 byte 會產生負值,我們如何檢索原始的無符號值?

為什麼在 Java 中將 int 轉換為 byte 會產生負值,我們如何檢索原始的無符號值?

Susan Sarandon
發布: 2024-11-09 09:10:02
原創
899 人瀏覽過

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

有趣的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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板