比较字节值?

2022-09-01 23:23:37

我很好奇为什么,当我用一个值比较一个数组时...byte

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

...返回 ,而...true

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

...不? 是一个数组,具有databyte

data[0] = (byte) 0xFE;

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

将整数进行比较,因为0xFF是整数,此表达式会将字节扩展到int,并将括号内的内容与第二个int进行比较。正如你所说,它将首先被缩放到整数并与整数进行比较,所以这是有效的。data[0]0xFE(254)data[0](byte)0xFE0xFE0xFE

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

将一个字节与整型进行比较:0xFE254

data[0] = (byte) 0xFE; 

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

-2不等于 ,所以这就是为什么在将数据 [0] 作为一个字节进行比较之前,必须将其作为一个字节进行比较,或者将其放大为一个整数。2540xFE

一个更简单的比较可能是

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

答案 2

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

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


推荐