[英]Converting to and from bytes in java
我在理解與字節或一般字節之間的轉換時遇到麻煩
byte b = (byte)170;
System.out.println("Byte to int" + (int)b);
為什么當我將170強制轉換為一個字節然后將該字節強制轉換為int時,我得到-86,這是什么正確的方法呢?
編輯:好的,所以我的問題的答案非常簡單( byte
范圍從-128到127)...讓我感到困惑的是,我真的希望二進制10101010位於字節中,所以我想出了用int表示該數字並將其放在字節中。 有人可以告訴我如何將二進制數轉換為字節嗎?
170的32位整數表示形式為
0000 0000 0000 0000 0000 0000 1010 1010
將其轉換為byte
,它將變為1010 1010
。 由於Java中的所有整數都是帶符號的,因此它將1010 1010
視為2的補碼 8位整數。 那是-86。
當您使用(int) b
將該字節轉換回整數時,它的符號擴展為:
1111 1111 1111 1111 1111 1111 1010 1010
也是-86。 您想要對其應用位掩碼,因此它再次變為170。
(int) (0xff & b)
將給您170:
1111 1111 1111 1111 1111 1111 1010 1010
0000 0000 0000 0000 0000 0000 1111 1111 & (bitwise and)
---------------------------------------
0000 0000 0000 0000 0000 0000 1010 1010
問題是字節是8位數據類型,其范圍是-128到127。因此沒有“無損轉換” ...
byte
原始類型的最小值為-128,最大值為127(含)。
您正在嘗試通過顯式強制轉換分配超出byte
范圍的170( int
),這會導致丟失有關數值總體大小的信息。
參見此處: 基本數據類型
還要檢查此JLS部分: 5.1.3縮小基元轉換
這是因為字節是在Java中簽名的,所以您基本上在溢出b。
要將整數轉換為字節:
int original = 170;
byte b = (byte)(0xFF & original);
通過“截斷”第一個字節之外的任何內容,這會將10101010放入byteNum。 如果您打印該號碼,您將得到-86。 要轉換回來,請執行以下操作:
int num = (int)b & 0xFF;
這會將字節轉換為整數,然后屏蔽簽名位,恢復值為170。
您不能將170存儲到一個字節中。 字節大小為-128至127。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.