[英]Issues when converting bytes to integers (Java specific?)
我對從字節到整數的轉換有些困惑。 考慮以下代碼:
byte[] data = new byte[] { 0, (byte) 0xF0 };
int masked = data[0] << 8 & 0xFF | data[1] & 0xFF; //240
int notMasked = data[0] << 8 | data[1]; //-16
因為Java中的字節是帶符號的,所以data[1]
不是十進制的240,而是2的補碼-16。 但是,它仍然應該是二進制形式: 0x11110000
,為什么我需要做data[1] & 0xFF
?
Java是否將所有內容都傳遞給Integer,然后再傳遞給|
操作員? 為什么&0xFF
有所作為?
Java字節是有符號的(不幸的是)-因此,當您將值提升為int
以便執行按位運算符時|
,最終將其符號擴展為0xFFFFFFF0
。 然后搞砸了|
與data[0]
。 用& 0xff
的掩碼將其轉換為240的整數值(只是0x000000F0
)。
但是,您確實遇到了問題。 這段代碼:
int masked = data[0] << 8 & 0xFF | data[1] & 0xFF;
應該:
int masked = ((data[0] & 0xff) << 8) | (data[1] & 0xFF);
...否則您將在上班后蒙面,這將不起作用。 我添加了括號,因為我不確定&
, <<
和|
...
它類似於已知的“拼圖”
byte x = -1;
x = x >>>= 1;
System.out.println(x);
產生
-1
沒班嗎 這是因為在編譯算術/移位/比較表達式之前,javac會將byte(以及short和char)提升為int或long(如果表達式中有長整數),因此其工作方式如下
x -> int = 0xFFFFFFFF; 0xFFFFFFF >>> 1 = 0x7FFFFFF; (byte)0x7FFFFFF -> 0xFF
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.