为什么我的int没有正确返回?

时间:2014-08-14 19:23:22

标签: java bit-manipulation

所以,我有一个相当简单的方法

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;

但我不应该这样做,我不会想。

问题

为什么我的位掩码不通过返回值返回返回值?

1 个答案:

答案 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);