我正在將計算機系統課程作爲我的碩士課程的預備課程,並且遇到了一些令我着迷且難以看到實際應用的東西,那就是「僞造減法」,並且事實上並不需要減法指令。是在現實世界中曾經使用過的「僞減法」嗎?
喜歡的東西:
說明X - Y
可以寫爲:
X +(〜Y + 1)現在
,這一切都很好,但它似乎像這對於簡單的減法過於複雜,特別是當你可以簡單地放置「x-y」時。是否有必要做到這一點的情況,還是僅僅可以做而不做的事情。
我正在將計算機系統課程作爲我的碩士課程的預備課程,並且遇到了一些令我着迷且難以看到實際應用的東西,那就是「僞造減法」,並且事實上並不需要減法指令。是在現實世界中曾經使用過的「僞減法」嗎?
喜歡的東西:
說明X - Y
可以寫爲:
X +(〜Y + 1)現在
,這一切都很好,但它似乎像這對於簡單的減法過於複雜,特別是當你可以簡單地放置「x-y」時。是否有必要做到這一點的情況,還是僅僅可以做而不做的事情。
這個二進制補碼的實現是在硬件中完成的,所以你不需要像內置數據類型那樣實現它們。
如果您正在製作一個n位整數算術庫,那麼您需要模擬整數加法,減法,乘法和除法等操作,在這種情況下,可能會執行這種技術來添加n位長度的數字,但在我看來,使用進位標誌來實現這一點更好。
我看不到這樣做的重點。它不再有效率。事實上,如果編譯器沒有優化它,它最終會生成更多的操作碼。
這通常是在硬件層面(即在ALU內部)完成的。
在軟件層面上,它通常是無用的,因爲它永遠比直接減法(除非你有一個真正奇怪的編譯器/平臺組合)效率更高。
這不會是編寫代碼的原因。 – 2011-06-16 15:28:36
編譯器推斷它是一條加法指令,但CPU將執行'x +(〜y + 1)'。這是如何在硬件中實現的。 – 2011-06-16 15:32:26
@ahmet:是的,這基本上是我的答案已經說過的。 – 2011-06-16 15:35:34
我沒有看到任何理由在你的C代碼中做到這一點。用軟件做它不會比使用減號運算符減去更快 - 並且更加不清楚。
但是,這是處理器執行減法的方式。我敢打賭,你已經看過這個代碼作爲硬件的一個例子,因爲它更容易看到如何將成爲一個邏輯電路。
所以......不,你不會用在現實世界中,這代碼,但這操作在您的處理器執行的很多倍。
這樣的東西在CPU擁有數十億晶體管之前更常見。一個特定的CPU可能不會實現一個特定的減法操作碼,所以一個編譯器(或彙編程序)的目標是必須知道這個技巧。
這些操作還可以幫助您瞭解CPU的內部實現。例如,CPU的分裂操作有時是通過取除數的倒數並乘以分紅來完成的;互惠是唯一正在進行的實際「分工」。
這通常不是如何執行部門! – 2011-06-16 15:43:41
看起來像2的補數學數學。它通常以這樣的硬件實現。 – 2011-06-16 15:28:35
我不確定,但我認爲它在某些二進制搜索實現中使用。 它消除了2^31的限制。你可以谷歌的「二進制搜索破解」,並找到該例子。它是一個頁面,有50種方式計算mid =(hi + low)/ 2 – Behrooz 2011-06-16 15:32:41
@Behrooz:做'低+(高 - 低)/ 2'。 – 2011-06-16 15:36:42