从整数中删除符号扩展?

Removing sign extension from an integer?

我正在尝试构建二进制格式的机器指令 loadi。机器指令本身由操作码组成,即 00000 目标寄存器、立即数位和一些常量值。它应该是这样的:

00000 00 0 00000000

假设我们要执行指令 loadi 2 -123。这将转换为机器指令:

0000010110000101

我正在尝试使用移位来构造此机器代码。我首先将目标寄存器移到正确的位置。然后,我移动立即位值:

instr = (dr << 9); // Destination register
instr += (1 << 8); // Immediate bit value

这将生成:

00000 10 1 00000000

我需要添加以完成指令并生成目标代码的最后一部分是常数值 -123。但是,问题是当我尝试时:

instr += constant;

它不起作用。我不需要在这里进行位移,因为我希望它从第 0 位开始。经过一些测试后,我认为问题可能是因为 -123 是符号扩展。我只想要前 8 位。

是否有简单的方法来检索 -123 的前 8 位?

这个问题中的所有值都由类型 int 表示。但是,我只使用第一个 16 bits.

您需要对值进行位掩码:

instr = (opCode << 11)
        | (reg << 9)
        | (1 << 8)
        | (value & 0xff);

一般来说:您可能希望对所有值进行位掩码;那 将是合乎逻辑的。但希望 regopCode 永远不会 是可以设置未使用位的值。

另外:只有当目标机器和 host 对负数有相同的表示,而且 表示没有符号大小。 (当然,今天,2的 补充几乎是普遍的。但这可能值得检查 loadi 是如何解释其值字段的。)