所以,我有一个相当简单的方法
byte[] mem;
int pc;
private int d16() {
return (((int) this.mem[pc++]) | ((int) this.mem[pc++] << 8) & 0x00FFFF);
}
如果我在返回之前打印该值并且LSB(Little endian形式)是0xFF
,那么我得到0xffcd
。但是,如果我在返回后打印返回值(我调用方法),我得到0xffffffcd
..这是一个非常不同的值。
我的软解决方案是
int a = d16() & 0xFFFF;
但我不应该这样做,我不会想。
为什么我的位掩码不通过返回值返回返回值?
答案 0 :(得分:2)
由于运营商优先级:根据this precedence table for Java,&
的优先级高于|
。尽管有所有括号,但两个OR(|
)操作数周围没有括号。这意味着首先发生这种情况:
((int) this.mem[pc++] << 8) & 0x00FFFF
然后该值与第一个值((int) this.mem[pc++])
进行“或”运算。当这些值转换为int
时,很可能在此处发生符号扩展,在应用了位掩码之后。这可以解释0xffffffcd
返回值。
您需要在|
操作数周围放置括号以确保OR首先发生,然后将使用位掩码进行AND。
// v v
return ( ( ((int) this.mem[pc++]) | ((int) this.mem[pc++] << 8) ) & 0x00FFFF);