对于无符号数和有符号数的补码,哪些算术运算是相同的?

jos*_*hlf 7 binary instruction-set instructions twos-complement

我正在设计一个简单的玩具指令集和随附的模拟器,并且正在尝试找出支持哪些指令。在算术方面,我目前有无符号加法、减法、乘法和除法。但是,我似乎无法找到以下问题的明确答案:哪些算术运算符需要签名版本,哪些算术运算符的无符号和补码签名版本等效?

例如,1111 的补码等于 -1。如果你加 1 并假装它是一个无符号数,你会得到 0000,即使将其视为 -1,这也是正确的。然而,这对所有数字都适用吗?那么其他三个运算(减法、乘法、除法)呢?

plu*_*ash 6

加法、减法和乘法是相同的,前提是:

  1. 您的输入和输出大小相同
  2. 您对溢出的行为是环绕模 2 n

分工不同。

许多指令集提供乘法运算,其中输出大于输入,同样,这些对于有符号和无符号是不同的。

此外,如果您用 C 语言编写模拟器,则需要注意该语言的一些错误功能。

  1. C 中带符号算术的溢出是未定义的行为。为了获得可靠的模 2 n行为算术必须使用无符号类型执行。
  2. C 会将小于 int 的类型提升为 int。需要非常小心地避免此类促销(在计算开始时添加 0u 或乘以 1u 是一种方法)。
  3. 从无符号类型到有符号类型的转换是实现定义的,我见过的实现做了明智的事情,但可能有一些没有。


Pau*_*l R 2

对于有符号和无符号 2 补码,加法和减法是相同的,假设您将以大多数 CPU 的正常方式处理上溢/下溢,即仅环绕。乘法和除法是不同的。因此,无论符号如何,您只需要一个加法例程和一个减法例程,但需要单独的有符号和无符号乘法和除法。

  • [非加宽乘法结果对于有符号和无符号类型是相同的](http://stackoverflow.com/q/14063599/995714) (5认同)