如何修复:OP 代码未正确读出

How to fix: OP-code isn't read out correctly

我目前正在尝试编写 Ninja VM,这是作为练习交给我的任务。 Opcode 和 value 保存在一个 32-Bit unsigned int 中,前 8 位是 opcode,其余的是 value。为了处理负值,我使用了练习

中提供的宏

#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))

然而,当试图检索

的操作码时

unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);(其中 PUSHC 等于 1

通过使用按位 AND,如此处所示 ->

int opcode = (i>>24)&0xff

我的结果是 255,虽然这种提取方法在值为正时有效,并且在这些情况下重现正确的操作码。

在研究这个问题时,我发现了“”,它似乎处理了我要问的问题,但是那个问题中给出的答案正是我在做的,有人知道更多吗?

SIGN_EXTEND 看起来像是要用于解码,从指令中提取 24 位并将它们转换为 32 位带符号整数。看起来它不打算用于编码。对于编码,IMMEDIATE(x) 似乎是为此而设计的。给定一个 32 位有符号整数,它会生成一个 24 位有符号整数,提供适合的值。

所以:

unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);

应该是:

unsigned int i = (PUSHC << 24) | IMMEDIATE(-2);