区分ALU中有符号和无符号整数的最佳方法是什么?

时间:2013-07-11 17:36:14

标签: integer unsigned signed alu

我正在开发自己的虚拟4位ALU。我想创建计算器(+, - ,*,/,%,只有整数,可能更多位)。我的目标是彻底了解它,而不是建立一个有效的设备。

目前我已经实现了4个功能:

  1. 添加。
  2. 添加一个。
  3. 积极到消极。
  4. 减法。
  5. 在所有函数中,结果的第5位被忽略。我想告诉ALU是否应该签署结果。最好的方法是什么?

    我的想法:

    1. 使用另外3个函数(第1个,第2个和第3个,结果是无符号整数)。
    2. 再使用一个输入字节(告诉是否忽略第5位)。
    3. 哪一个更好?你知道更好的方法吗?

2 个答案:

答案 0 :(得分:0)

如果仅使用加法或减法,则无需添加更多函数。

在签名的情况下解释不同的数字是很常见的。 通常,最高位用于确定数字是否为负数。在你的ALU中,你可以有0到15(无符号)或-8到7(有符号)的数字,但这取决于你如何解释它们。加法或减法的逻辑是相同的,不需要。

例如:

  0111 (7)
 +0001 (1)
 =====
  1000 (8)

  1110 (-2)
 +0010 (2)
 =====
  0000 (0)

正如您所看到的那样,对于正数和负数,加法的工作方式相同。此时未使用的第5位可用作下一次添加的进位(用于添加具有更高位数的数字)。

答案 1 :(得分:0)

在寄存器中,值只是一组位。

一个选项是您的运营商假设操作数具有某些格式。例如:
- ADD可以假设signed big-endian
- UADD可以假设unsigned little-endian

另一种方法是在一个寄存器中设置一个位来表示ALU以签名方式或无符号方式操作。

还可以注意到,对于加法和减法,ALU确实知道值是否有符号并不一定重要。

   Binary   :  Signed Meaning  :  Unsigned Meaning
----------------------------------------------------
   1111     :  -1              :  15
   0111     :   7              :   7
1111 - 0111 :  -1 - 7          :  15 - 7
   1000     :  -8              :   8

对于加法或减法,不需要知道值是否有符号。

您只需要决定如何处理溢出 - 1111 + 0111 = 10110
- 在4位ALU中,它是0110,但有溢出