計算機內部是怎麼進行無符號的減法的

時間 2021-05-09 12:19:38

1樓:學無所成

cpu 是不會區分unsigned和 signed的。

c語言中的有符號和無符號是語言邏輯設計層面上的概念,因為最終還是要經過編譯器編譯成cpu能夠識別的二進位制指令。

這裡最關鍵的就在於編譯器該怎麼做?

你要進行無符號數的減法運算,首先無符號數該怎麼表示?

編譯器通常是採用補碼的方式。

那如和進行減法運算呢?

編譯器需要翻譯成cpu能夠執行的減法指令,比如x86的sub指令。

接下來就是cpu內部要幹的事了。

那麼cpu又是如何執行減法計算的?cpu內部的執行邏輯是什麼樣的?

CPU是怎麼實現運算的 ? - 胖君的回答 - 知乎 https://www.

2樓:

有符號和無符號的加減法,在CPU裡的操作是一樣的,而有無符號要看你後續對這個數怎麼處理。

比如計算a-b然後判斷是否大於0。如果用有符號數來做,CPU會先算a-b,得到c,然後把c和0進行「有符號比較」。

而如果用無符號來做,CPU也是先計算a-b=c,但之後是把c和0進行「無符號比較」。減法是一樣的,但比較操作是不一樣的。

另外,加減法是一樣的,但是乘除法卻不一樣。尤其是帶餘除法,好像連餘數的正負怎麼確定都有好幾個標準。我就說個簡單點的乘法吧。

8位二進位制,範圍是0到255,或-128到+127,兩個8位數相乘得到16位數。

例如計算兩個11111111(二進位制)相乘吧,這是無符號255*255還是有符號(-1)*(-1)呢?

如果是後者,算出的結果是1,或說0000000000000001。而如果是前者,那顯然應該是乙個很大的數,而且在16位範圍內,絕對不會得到0000000000000001。如果我沒想錯的話應該是1111111000000001(7個1,8個0,最後1)。

可見,作為有符號數和作為無符號數,它們的乘法運算是不一樣的,所以CPU要實現乘法的話需要實現兩種運算:有符號乘法、無符號乘法。(其實可以證明有符號和無符號乘法結果的低8位是一定相等的,出現不同的根本原因是8位二進位制對乘法運算不封閉)

但是加法和減法卻不需要區分有符號無符號,實現加法只需要一種運算:加法,有符號加法和無符號加法都進行同乙個過程。減法也是。

而比較大小的運算,就更需要區分了。

3樓:Tia

計算機實際上並不會計算,它只是把輸入經過一些邏輯線路,產生乙個輸出而已。

顯而易見,無符號的加減法和有符號的加減法,邏輯是不同的,它們理應採用不同的處理方法。但這個並不是計算機自己知道的,而是編寫程式的人設計好的。包括劃分資料型別,給運算標明意義,給輸入和輸出制定標準等等,完全是程式設計出來的。

計算機只會取出輸入的一串碼(資料),和輸入的另一串碼(程式)放到同乙個邏輯電路上,產生新的一串碼(程式或輸出)。

4樓:「已登出」

所有資料對於計算機來說是一樣的,加法和減法對於計算機都是一種運算,因為整數的表現形式為二式補碼,所有加減運算只要有加法器(full adder,最簡單的alu實現)無腦加就行了,加出來你說他是有符號數,那就按有符號數的辦法解釋那一串一和零,無符號的話,那就按無符號解釋。比如說對於乙個四位計算機,整數-1和15的表示都是1111,看你怎麼解讀了。

計算機內部 128是怎麼運算的?

川平馬一 128考慮為無符號整型資料是可以用8位二進位制表示的。在帶符號的整型資料裡,他的最高位只是符號位。剩下7位才是資料位,所以128無法使用8位二進位制數表達,存在溢位。 32位處理器,字長是32位,可以單指令計算32位和32位的加減法。如果遇到溢位,暫存器會有溢位標誌位被設定,此處可以寫程式...

計算機是如何進行整數計算和小數計算 包過無窮小數

dovisutu emm.很難在乙個回答裡說完,因為這真的太複雜了.不過一點是確定的 肯定不是模擬珠子 首先,萬物皆2進製 在計算機裡 整數就直接變成2進製就可以了,全加器的搭建很好做,用上補碼就可以做減法了,堆疊全加器 並行 移位寄存 序列 可以做出乘除 整數 一般我們就直接分配16 32 64b...

計算機編譯時,內部硬體是如何工作的?

Interlock mov原始碼可以是ascii,mov原始碼編譯過之後的mov指令叫機器碼,並不是ascii碼啊編譯器就是,按照事先設定好的規則,把原始碼變成另一種編碼 比如機器碼 的軟體。一共就那麼幾種指令,不需要那麼多位。64位CPU一次只能處理64bit,每一位都很寶貴啊 Crane 硬體並...