是否删除整数的符号扩展

Removing sign extension from an integer?

本文关键字:符号 扩展 整数 删除 是否      更新时间:2023-10-16

我正在尝试构造二进制格式的机器指令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永远不会可以是可以设置未使用的比特的值。

此外:只有当目标机器和主机对负数有相同的表示,并且表示不是符号大小。(当然,今天2点补码几乎是普遍的。但它可能值得检查loadi如何准确地解释其值字段。)