比较字节值?

我很想知道为什么,当我将一个byte数组与一个值进行比较时……

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

…返回true ,而……

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

…才不是? data是一个byte数组

 data[0] = (byte) 0xFE; 

 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; 

是一个字节(所以它是有符号的 ),它的值是-2

-2不等于254 ,这就是为什么你必须将data [0]比作一个字节,或者在将它与整数0xFE进行比较之前将其扩展为整数。

更简单的比较可能是

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

我相信它与将0xFF提升为符号扩展的int有关。 在第一个表达式中,0xFE也被提升为int,因此data[0] & 0xFF的结果也是一个int,并且完成了int比较。

但是在第二个代码示例中,没有进行任何操作,因此没有提升到int。 也就是说,数据[0]不会被提升为int,但0xFE是一个int。