2014-09-02 535 views
1

我正在爲系統編號做一些練習問題。一切都很好,但我陷入了一個問題,我從十六進制系統中較小的一個減去較大的數字(基數爲16)從較小數字(十六進制)中減去較大數字

(1234 - ABEF)我開始這樣做;

4 - F = 5 (borrow 16 from 3 so it becomes 2) 
2 - E = 4 (borrow 16 from 2 so it becomes 1) 
1 - B = 6 (borrow 16 from 1 so it becomes 0) 
0 - A = ? I don't know what to do here ? where should I borrow from ? 

我用了一個在線計算器,它告訴我最後的答案是 (1234 - ABEF = FFFF6645)

謝謝

回答

1

沒有什麼來自借款,所以被否定。

您使用的在線計算器的假設是您正在處理32位有符號值,並且由於您從較小的數中減去一個更大的數,因此從1234中減去ABEF會變成FFFF6645,也就是十進制-39355。

備註:如果您在Windows上,內置計算器可以幫助您在「程序員」視圖中執行這些計算。

0

邏輯沒有減法,減法是通過加法完成的。記住,二進制補碼「反轉並加1」。當你做小數運算並且加99 + 3時,第一列是9 + 3 = 2攜帶1.該結轉數進入頂部,第二列1(進位)加上9(第一操作數)的進位槽加上0 (用於第二操作數的placholder)。是0進位1,第3列是1 + 0 + 0 = 1進位零,我們可以稱之爲完成。您可以顯示三行,進位,第一個操作數,第二個操作數。進位插槽在第一列可用。現在考慮二進制,你可以用二進制與列進行完全相同的數學計算(十六進制只是二進制,四位組,如果你用鉛筆和紙做這個,你會把十六進制分成單獨的位)。所以我們從學校得知a + b = a +(-b)是正確的,並且我們知道在二進制中-b是二進制補碼是倒數並加1。那麼如果你只是簡單的反轉並使用它作爲第二個操作數,並且在第一列的進位時隙中加1,那麼0x1234 - 0xABEF與0x1234 +( - 0xABEF)= 0x1234 +( 〜0xABEF)+ 1 = 0x(〜0x0ABEF)+ 1(增加一些填充)= 0xxF5410 + 1 = 0xF6645。或者如果你想修剪它到16位,那麼它是0x6645。如果你在做32位,那麼它是0xFFFF6645,64位0xFFFFFFFFFFFF6645。就像在十進制99 + 3 = 100或0100或00000000100中一樣,取決於我們想用數字填充多少個地方。

如果我們做了0x1234 - 0x0005 = 0xxFFFFA + 1 = 0x01224會怎麼樣。左邊的填充是零。沒有借款。另一個數字是借來的,左邊的是永遠的。或者另一種想法是否定的答案是否定的。二進制中的負數是倒數,並且右移一位,所以0x001倒數爲0xFFFFF ... FFFFE的位數與您在alu或寄存器中的位數相同,然後加1,得到0xFFFF .... FFFF。如果它是8位寄存器0xFF,則16位0xFFFF,32 0xFFFFFFFF。與上面的0xFFFF ... FF6645一樣。反轉並添加一個0x99BA + 1 = 0x99BB = 39355或實際上-39355。

0x1234 = 4660,0xABEF = 44015,在計算器4460-44015 = -39355。

相關問題