23

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

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

...返回true,而...

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

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

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

2 回答 2

26
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);
于 2012-11-15T06:19:47.353 回答
3

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

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

于 2012-11-15T06:12:08.247 回答