無符號數的減法如何實現?

時間 2021-06-05 22:03:47

1樓:大汪

在計算機內部,無符號數的加減法等同於補碼進行加減法,只是最後對於結果的解釋不一樣

舉個栗子

// 情形一

unsignedA,

B;A=

0;B=

1;A-

B;則A-B進行的其實是[A]補+[-B]補,就是[0]補 + [-1]補 = 00000000H + FFFFFFFFH = FFFFFFFFH

只不過最後的結果是按照無符號數來解釋,那麼最後的結果就是FFFFFFFFH

但如果是下面的這樣

// 情形二

intA,B

;A=0

;B=1

;A-B

;A-B = [A]補+[-B]補,就是[0]補 + [-1]補 = 00000000H + FFFFFFFFH = FFFFFFFFH

結果仍然為FFFFFFFFH

但是由於A、B是int型,這時候就是按照有符號數來理解結果就是-1(真值)

在計算機內部,無符號整數和其它型別一樣,統一都是按照補碼加減法規則計算(畢竟所有的數都是按照補碼存放的),而唯一不同的是,對最後的結果的解釋方式不同

一言以蔽之——過程大家一樣,都是補碼加減法規則,但是計算出來的結果的解釋方式不同

2樓:Aecced

無符號數只是C語言抽象出來的乙個概念。機器碼中沒有區分無符號數和有符號數,只是看暫存器的標誌位SF(Sign Flag)來決定它的符號,加、減法運算都是統一由加法器來實現的。

[A+B]補=[A]補 + [B]補

[A-B]補=[A]補 + [-B]補

3樓:土地測量員

無符號數A-B,可以和補碼表示的有符號數一樣,轉化成,A+(B的補碼),即A+(~B+1 )。

試著推導一下,假設A和B都是n位無符號數,則A+(B的補碼) = A+(~B+1) = A + (2^n-1-B+1) = A-B+2^n,然後結果會對2^n取模(也就是發生了截斷),得到A-B。

事實上,有符號數用補碼表示的一點好處就是,有符號和無符號數加法減法都有著一樣的位級行為,可以一定程度上簡化cpu運算器的設計。

4樓:黃亮anthony

不是這樣的,計算機的實現為大規模邏輯電路。

減法也是實現成一種邏輯電路

乙個2位的無符號減法器,好像需要兩個異或門,乙個或門,和乙個非門吧,記不清了。

計算機如何識別有符號數和無符號數?

CPU並不知道送進來的是有符號數還是無符號數,都統一用補碼來計算 補碼運算不在乎是有符號還是無符號 然後把標誌位設定好,上層讀資料的時候按照需要的邏輯結合標誌位來得到相應的資訊。 朱涵俊 計算機只有01,無所謂符號,包括浮點,整數。那麼乙個數字儲存的計算機中記憶體中,到底代表什麼意思,就看程式設計師...

無符號數相減後若是負數,結果會如何?

wujun 對於計算機編譯器而言是沒有減法的,減法是首先對無符號數取加法的逆元,在進行加法 所以我們首先加上x y x y.在上面的情況中單 x 當 x y.我們有y x 2 w x y 愛你一萬年噢噢噢 10 42 32,若機器字長為32位,而且採用補碼,則 32表示為FFFFFFE0H 十六進製...

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

學無所成 cpu 是不會區分unsigned和 signed的。c語言中的有符號和無符號是語言邏輯設計層面上的概念,因為最終還是要經過編譯器編譯成cpu能夠識別的二進位制指令。這裡最關鍵的就在於編譯器該怎麼做?你要進行無符號數的減法運算,首先無符號數該怎麼表示?編譯器通常是採用補碼的方式。那如和進行...