gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:47:21 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com