2008-12-06 27 views
4

X = 01001001和Y = 10101010

如果我想將它們加在一起,我該怎麼做?他們是「兩個補充」... 我已經嘗試了很多東西,但我不太確定我得到正確的答案,因爲似乎有不同類型的規則。

只是想確保它是正確的:
1.添加它們,因爲它們沒有轉換負
2.轉換負數你,這就是總和。

f.eks
01001001 10101010 + 11110011 = => 00001100 => 1101 => -13

或?
1.轉換負
2.一起添加他們並轉換負

f.eks
01001001 10101010 + => 01001001 + 01010110 => 10011111 => 01100001 => -97


所以基本上我想要做的是採取:XY和X + Y
有人可以告訴我該怎麼做嗎?

一些資源網站: student-binary celtickane swarthmore添加負面和正面的二進制?

+0

有能力的人應該將此標記爲'家庭作業' – epotter 2009-01-21 02:46:45

回答

12

二進制補碼的美妙之處在於二進制級別是解釋而不是算法的問題 - 添加兩個有符號數的硬件與無符號數相同(忽略標誌位)。

你的第一個例子 - 「只是添加它們」 - 是正確的答案。你的榜樣數字

  • 01001001 = 73
  • 10101010 = -86

所以,正確答案是確實-13。

減法也是一樣的,因爲對於二進制補碼來說不需要特殊的處理:你「只是減去它們」。

請注意,有趣的地方是處理溢出/下溢位。您不能將73 - (-86)的結果表示爲8位二進制補碼...

+0

但是如果減法與添加它們相同?然後不會我得到相同的答案? – suxSx 2008-12-06 21:32:07

1

添加在補不需要任何特殊處理,當兩個參數的符號是​​相反的。您只需像往常一樣將它們添加到二進制文件中,結果的符號就是您保留的符號。

1

只是爲了確保您瞭解二進制補碼,可以將正數轉換爲負數(或反之亦然):反轉每一位,然後將1加到結果中。

例如,您的正數X = 01001001變爲10110101 + 1 = 10110110作爲負數;您的負數Y = 10101010成爲01010101 + 1 = 01010110作爲正數。

要從X中減去Y,則取反Y並相加。 I.E. 01001001 + 01010110。

1

您的困惑可能是因爲涉及的數字的寬度。爲了獲得更好的感覺,你可以嘗試從你的無符號整數中創建一個有符號的整數。

如果您的無符號整數的MSB已經是0,那麼您可以將它作爲有符號讀取並獲得相同的結果。
如果MSB是1,那麼你可以在左邊追加一個0來得到一個有符號的數字。您應該簽名擴展(即,如果MSB爲0,則添加0,如果MSB爲1,則添加1)所有有符號數字以獲得相同寬度的數字,以便可以「正常」執行算術。

例如,使用你的號碼:

X = 01001001:無符號,最高位爲0,什麼也不做。

Y = 10101010:簽名,與X沒有任何關係,仍然無能爲力。

但是,如果我們改變X的MSB爲1:

X = 11001001:未簽名,MSB是1,添加0 - > 011001001

Y = 10101010:簽字,擴展X,所以符號擴展Y - > 110101010

現在你有兩個有符號的數字,你可以添加或減去你已知的方式。