【发布时间】:2019-05-27 20:33:50
【问题描述】:
我目前正在尝试编写 Ninja VM,这是作为练习交给我的任务。操作码和值保存在 32 位无符号整数中,前 8 位为操作码,其余为值。为了处理负值,我使用了练习中提供给我的宏
#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,尽管这种提取方法在值为正时有效,并在这些情况下重现正确的操作码。
在研究这个时,我发现了“How I get the value from the Immediate part of a 32 Bit sequence in C?”,它似乎与我要问的问题有关,但是该问题中给出的答案正是我正在做的,有人知道更多吗?
【问题讨论】:
-
此宏似乎正在从 24 位负值转换为 32 位。所以
SIGN_EXTEND(-2)没有按预期使用它
标签: c c89 opcode vm-implementation