所以,我有一个相当简单的方法
byte[] mem;
int pc;
private int d16() {
return (((int) this.mem[pc++]) | ((int) this.mem[pc++] << 8) & 0x00FFFF);
}
如果我在返回之前打印该值,并且 LSB(小端形式)是 0xFF
,那么我会得到 0xffcd
例如。但是,如果我在返回后打印返回值(我调用该方法的地方),我会得到 0xffffffcd
.. 这是一个非常不同的值。
我的软解决方案是
int a = d16() & 0xFFFF;
但我认为我不必这样做。
问题
为什么我的位掩码没有跟随返回值通过返回?
最佳答案
这是因为运算符优先级:根据 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);
关于java - 为什么我的 int 没有正确返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316042/