2012-11-15 121 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值。