我有点难以理解,我有这段代码:
public class HelloWorld{
public static int readByte(byte b) {
return b & 0xFF;
}
public static short readShort(byte[] b) {
return (short)(readByte(b[0]) | readByte(b[1]) << 8);
}
public static void main(String []args){
byte[] b = {(byte)0x94, 0x00};
System.out.println(readShort(b));
}
}
现在返回的结果是148,但是我不明白为什么如果我删除屏蔽“&amp; 0xFF”,结果会改变,如果你一次读取1个字节,则0xFF的屏蔽不会假设影响字节(这就是我所知道的至少),我的一个朋友试图向我解释这个,他说它与字节“0x94”无符号并且在readByte方法中继续进行,但我无法理解它和我真的很难理解为什么你需要掩盖才能正确读取字节,感谢提前帮助我的任何人!
答案 0 :(得分:3)
字节是签名数据。所以0x94是-108。当您将其作为int返回时,返回-108扩展为4个字节,这不是0x94(其FFFFFF94)。这显然搞砸了你以后的ORing。掩码修复它,因为字节0x94在与0xFF进行AND运算之前转换为int,因此AND将从负扩展中删除那些额外的1。