我正在开发自己的虚拟4位ALU。我想创建计算器(+, - ,*,/,%,只有整数,可能更多位)。我的目标是彻底了解它,而不是建立一个有效的设备。
目前我已经实现了4个功能:
在所有函数中,结果的第5位被忽略。我想告诉ALU是否应该签署结果。最好的方法是什么?
我的想法:
哪一个更好?你知道更好的方法吗?
答案 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,但有溢出