哪些算术运算在无符号和二进制补码上是相同的?

时间:2014-01-31 08:16:39

标签: binary twos-complement instructions instruction-set

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

因此,例如,二进制补码中的1111等于-1。如果你加1并假装它是一个无符号数,你得到0000,即使把它想象为-1也是正确的。但是,这适用于所有数字吗?那么其他三个操作(减法,乘法,除法)怎么样?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

加法,减法和乘法是相同的:

  1. 您的输入和输出大小相同
  2. 您在溢出时的行为是模数2 n
  3. 分工不同。

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

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

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

答案 2 :(得分:0)

您的所有操作都需要溢出检查,否则在某些情况下会返回错误的值。这些检查的无符号版本与签名版本不同,因此您需要单独实施每个例程。