2012-11-15 58 views
20

我很好奇,想知道爲什麼,當我比較一個byte陣列值...比較字節值?

boolean match = ((data[0] & 0xFF) == 0xFE); 

...返回true,而...

boolean match = (data[0] == 0xFE); 

...做不? databyte陣列

data[0] = (byte) 0xFE; 
+0

,能得到任何編譯警告?我認爲這些可能是整數文字(然後比較可能會完成爲int,與數組中的負數和正整數文字)。 – Thilo

回答

22
boolean match = ((data[0] & 0xFF) == 0xFE); 

比較整數作爲0xFF的是一個整數,這個表達式將您的字節data[0]擴展到一個int和比較有什麼括號到第二INT 0xFE(254)內。正如你所說data[0](byte)0xFE,它將首先縮放到整數0xFE並與整數0xFE比較,所以這個工作。

boolean match = (data[0] == 0xFE); 

一個字節進行比較爲int 0xFE254

data[0] = (byte) 0xFE; 

是一個字節(所以它的signed)和它的值是-2

-2不等於254,所以這就是爲什麼你必須比較數據[0]作爲一個字節或將其放大到比較它的整數0xFE前一個整數。

一個簡單比較可能

boolean match = (data[0] == (byte)0xFE); 
+0

非常感謝! –

3

我認爲,它與促進0xFF的與符號擴展一個int做。在第一個表達式中,0xFE也被提升爲int,因此data[0] & 0xFF的結果也是一個int,並且完成了一個int比較。

但在第二個代碼示例中,沒有操作正在完成,因此沒有提升爲int。也就是說,data [0]不會被提升爲int,但0xFE是一個int值。