我正在设计一个简单的玩具指令集和随附的模拟器,并且正在尝试找出支持哪些指令。在算术方面,我目前有无符号加法、减法、乘法和除法。但是,我似乎无法找到以下问题的明确答案:哪些算术运算符需要签名版本,哪些算术运算符的无符号和补码签名版本等效?
例如,1111 的补码等于 -1。如果你加 1 并假装它是一个无符号数,你会得到 0000,即使将其视为 -1,这也是正确的。然而,这对所有数字都适用吗?那么其他三个运算(减法、乘法、除法)呢?
加法、减法和乘法是相同的,前提是:
- 您的输入和输出大小相同
- Your behaviour on overflow is wraparound modulo 2n
分工不同。
许多指令集提供乘法运算,其中输出大于输入,同样,这些对于有符号和无符号是不同的。
此外,如果您用 C 语言编写模拟器,则需要注意该语言的一些错误功能。
- Overflow of signed arithmetic in C is undefined behaviour. To get reliable modulo 2n behaviour arithmetic must be performed using unsigned types.
- C 会将小于 int 的类型提升为 int。需要非常小心地避免此类促销(在计算开始时添加 0u 或乘以 1u 是一种方法)。
- 从无符号类型到有符号类型的转换是实现定义的,我见过的实现做了明智的事情,但可能有一些没有。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)