有符號數的運算方法

2021-10-06 02:04:18 字數 2868 閱讀 9708

一.有符號數的加減法

1、符號數與無符號數的人為規定性:

乙個數,是有符號數還是無符號數都是人為規定的。進行二進位制運算時用無符號數或是補碼運算時,結果都是正確的。

10000100+00001110

若規定為無符號數,即 132+146=146d 。

若規定為符號數,則為-124+14=-110,而[-110]補=10010010。解釋:10000100是 -124的補碼,0001110是14的補碼,在機器中運算後得出的結果是[-110]的補碼。機器中的有符號數的運算一般就是補碼的運算。

2、補碼加減法運算

計算機中,當確定為符號數運算時,符號數一律用補碼表示,運算時符號位和數字位一起參加運算。同樣,運算結果也用補碼表示。

1)兩符號數相加公式:

[x+y]補 (mod2)=[x]補+[y]補    //mod2即 mod 2^n,即丟棄符號位的進製(因為符號位參與運算是補碼運算的特點)

2)兩符號數相減公式:

[x-y]補 (mod2)= [x]補+[-y]補

3.例子:

求3ch-90h。

首先3ch=0011 1100,90h=1001 0000

(1)當為有符號數時,顯然這兩個數是某兩個數的補碼。(具體是哪兩個數x y, 需要自己計算)。運算結果也是補碼,是x-y的補碼 [x-y]補。機器只運算到這一步。[x-y]補 就是運算結果,溢位 進製等標誌位也都是這個補碼運算過程的結果,由硬體alu運算。x-y並不是機器的運算結果,由[x-y]補求x-y是在計算機組成原理中由程式設計師或者編譯器完成的工作,對於編譯器來說運算結果才是x-y,編譯器屬於軟體,不屬於硬體機器。

根據微機中有符號數(補碼)的減法公式,[x]補(輸入)-[y]補(輸入)=[x]補+[-y]補(求補操作結果)=[x-y]補(微機運算結果) ,求[-y]補是關鍵

[x]補=0011 1100,[y]補=1001 0000,

[-y]補=[y]補的 求補=0110 1111(取反)+1(加一)=0111 0000  //不是[y]補的補碼!!更不存在什麼 -[y]補 的補碼(不存在-[y]補這種寫法)

解釋求補操作:

無論-[y]補的符號位是0還是1。正數也可以有求補操作,只是得到的數不叫補碼,就是為了把減法轉換成加法。求補操作 就是取餘(求補)(補碼是人規定的,但是求補是數學定義)。證明[-y]補=對-[y]補 求補操作:[0]補=[-x]補+[x]補 。[-x]補和[x]補不是正數和負數的關係!!而是互補關係,算數相反,不是邏輯相反。另外仔細想一下,我們學補碼是為了什麼?以前是為了求乙個原碼的補碼是什麼,因為計算機組成原理中 從編譯器到微機 從微機到編譯器 需要原碼變成補碼 補碼變成原碼,但是在微機原理中,就不需要這一部分了,而是需要 求補操作了。計算機組成原理中,是由y原碼求出來的[-y]補,而微機原理中是 對[y]補 求反操作出來的[-y]補,計算過程都不一樣。計算機組成原理中的過程可以理解 但是不是微機真正的運算過程,這一次學習的微機原理的補碼的加減法才是真的硬體的運算過程!

另外,補充一點,x=[x]補 的補碼,由補碼求原碼時不用按照由原碼求補碼的逆過程(補碼為1000 0000時例外!)。

《微機原理與接**術》中寫道:「由加法器的原理圖,加法器的方式控制m用於控制加減法,當m=0時進行s=a+b操作,當m=1時進行s=a-b操作。當m=1(減法)時,各個異或門對b的各位進行求反,並將1作為初試進製加入結果,也就是執行對b的求反加1,即求補操作。」 也就是說!無論b是有符號數還是無符號數,無論符號位是0還是1,只要m=1,就統統對b執行求補操作!!!所以,求補操作可以對符號位是0的數執行!

所以,[x-y]補=0011 1100-1001 0000=0011 1100+0111 0000=ach

(2)補碼最大好處就是不管是有符號數還是無符號數都可以用同一套加減法。系統對有符號數和無符號數的加減法都採用一樣的策略。

無符號加減法不存在溢位問題,只是將進製或借位儲存在cf中。

機器不知道你進行的運算是否有符號,如果你進行的是有符號運算,你需要檢視of,否則不需要。

所以,溢位不溢位,是由程式設計師判斷的,機器不知道。

不管是有符號數還是無符號數,微機都是按補碼運算,至於是進製還是溢位不僅要看進製標誌位,還要看溢位標誌位。

只不過在做無符號數運算時程式設計師不考慮溢位標誌位,只考慮進製標誌位而已。

比如0111+1101,你說它是無符號數7+13呢,還是有符號數7-3呢?

對微機而言這是一回事!

所以,微機中,無符號數時和有符號數時的運算結果一定是一樣的。

(3)注意這道題和《計算機組成原理》學補碼加減運算時的題目的區別。

例子:x=+0101,y=-1010,求x-y。

題目給的x y,是原碼, 所以已經預設是有符號數,也有判斷是否溢位,所以預設的計算過程也是指機器運算過程。

原碼在機器中 均是以補碼儲存和運算的,

[x]補-[y]補=[x]補+[-y]補=[x-y]補,只用到了[x]補+[-y]補=[x-y]補

屬於型別:已知x y,所以先求[x]補, [-y]補 ,便求得[x-y]補。然後求x-y。

也就是說,上一題已知的是[x]補 [y]補,(機器的)運算結果是[x-y]補。中間過程沒必要求出x y是什麼數。

本題已知的是x y,先得出機器的運算結果[x-y]補,在做編譯器的工作由[x-y]補 求出x-y。

二者求[-y]補的方法不一樣:前者是對[y]補 求補操作 求得的,後者是由-y求得。

可以說,後面例子是編譯器和微機共同工作的過程,前面例子只關係微機運算。

有符號數與無符號數運算

有符號數與無符號數之間運算問題,這個問題測試是否懂得c語言中的整數自動轉換原則,有些開發者懂得極少這些東西。當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此,從這個意義上講,無符號數的運算優先順序要高於有符號數,這一點對於應當頻繁用到無符號資料型別的嵌入式系統來說是丰常...

Verilog有符號數運算

在數位電路中,出於應用的需要,我們可以使用無符號數,即包括0及整數的集合 也可以使用有符號數,即包括0和正負數的集合。在更加複雜的系統中,也許這兩種型別的數,我們都會用到。有符號數通常以2的補碼形式來表示。圖1列出了4位二進位制表示法所對應正負數。進一步觀察,我們發現兩種型別數的加減法是一樣的,做加...

Verilog 有符號數與無符號數運算

無符號數運算,左值位寬不夠,發生截斷的現象 2.兩個無符號數運算,賦值給乙個有符號的數。可以看出,右側先按照無符號數進行運算,取得的運算結果按照左側的符號進行資料顯示。3.兩個無符號數運算,無符號數賦負值 補碼 按照該補碼對應的正值進行處理。結果同上。4.有符號數和無符號數運算,賦值給有符號數。補碼...