是否删除整数的符号扩展
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);
一般来说:您可能想要对所有值进行位掩码;那个这是合乎逻辑的。但希望reg
和opCode
永远不会可以是可以设置未使用的比特的值。
此外:只有当目标机器和主机对负数有相同的表示,并且表示不是符号大小。(当然,今天2点补码几乎是普遍的。但它可能值得检查loadi
如何准确地解释其值字段。)
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 尝试使用 Cython 扩展时未定义的符号
- 符号将11位扩展到32位
- 使用范围检查和带符号的size_type扩展std::vector
- 是否删除整数的符号扩展
- Linux 如何解析用作扩展的库的未解析符号
- 加载使用 SWIG 制作的 php 扩展时未定义的符号
- Python C 扩展使用 numpy 和 gdal 在运行时给出未定义的符号
- qml扩展上的未定义符号(来自示例)
- Arduino中不需要的符号扩展
- 符号扩展对文字与变量
- 使用从结构体扩展的符号
- 扩展'isalnum'以识别 UTF-8 变音符号
- 在x64汇编文件上的符号扩展
- C++符号扩展
- 类扩展模板类的C++符号导出
- 错误的符号扩展c++/qt