2013-07-11 25 views
0

我正在開發自己的虛擬4位ALU。我想創建計算器(+, - ,*,/,%,只有整數,也許更多位)。我的目標是徹底理解它,而不是建立一個有效的設備。在ALU中區分有符號和無符號整數的最佳方法是什麼?

目前我已經實現4個功能:

  1. 添加。
  2. 添加一個。
  3. 正向負向。
  4. 減法。

在所有函數中,結果的第5位被忽略。我想告訴ALU結果是否應該簽署。什麼是最好的方式來做到這一點?

我的想法:

  1. 使用3個功能(第1,第2和第3與無符號整數結果)。
  2. 使用一個更多的輸入字節(告訴是否忽略第五位)。

哪一個更好?你知道更好的方法嗎?

回答

0

如果僅使用加法或減法,則不需要添加更多的函數。

在簽名的情況下解釋不同的數字是很常見的。 通常情況下,最高位用於確定數字是否爲負數。在您的ALU中,您可以使用0到15(無符號)或-8到7(有符號)的數字,但這取決於您如何解釋它們。加法或減法的邏輯是相同的而不是必需的。

例如:

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

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

正如你可以看到除了適用於正數爲負同樣的方式。此時未使用的第5位可用作下一個加法的進位(用於添加更高位數的數字)。

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,但溢出

相關問題