簡體   English   中英

將字節轉換為整數時出現問題(特定於Java?)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM