【问题标题】:Best way to distinguish signed and unsigned integers in ALU?在 ALU 中区分有符号和无符号整数的最佳方法?
【发布时间】:2013-07-11 17:36:14
【问题描述】:

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

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

  1. 正在添加。
  2. 添加一个。
  3. 从阳性到阴性。
  4. 减法。

在所有函数中,结果的第 5 位被忽略。我想告诉 ALU 是否应该对结果进行签名。最好的方法是什么?

我的想法:

  1. 使用另外 3 个函数(结果是第一个、第二个和第三个无符号整数)。
  2. 使用多一个输入字节(判断是否忽略第 5 位)。

其中哪一个更好?你知道更好的方法吗?

【问题讨论】:

    标签: integer unsigned signed alu


    【解决方案1】:

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

    一种选择是您的操作员假定操作数具有某些格式。例如:
    - 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
    - 在 0110 的 4 位 ALU 中,但有溢出

    【讨论】:

      【解决方案2】:

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

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

      例如:

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

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

      正如您所见,加法对正数的作用与对负数的作用相同。此时未使用的第 5 位可用作下一次加法的进位(将位数较高的数字相加)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 2011-08-10
        • 2013-06-02
        • 2012-03-06
        • 2013-10-02
        • 2015-02-17
        • 2017-06-07
        相关资源
        最近更新 更多