1. 程式人生 > >補碼概念、補碼公式以及MATLAB求補碼方法

補碼概念、補碼公式以及MATLAB求補碼方法

求負數補碼公式(x為負數二進位制數,N為位寬)

       (1)

或者

      X補碼 = 2^N + X     (2)    (X為十進位制數,得到十進位制X補碼,再將其轉換為二進位制形式) 

補碼 = 2的N次方 - (負數絕對值的二進位制表示)

補碼 + 負數絕對值的二進位制表示 = 2的N次方

對於位寬為N的正數x,我們要求−x的補碼就是求正數的原碼,所以我們得到在MATLAB裡求一個位寬為N的整數x的補碼錶示的程式碼如下:

計算機中的符號數有三種表示方法,即原碼反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示,用1表示

,而數值位,三種表示方法各不相同。

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。

實質上是計量器產生溢位的量,它的值在計量器上表示不出來,計量器上只能表示出模的餘數。任何有模的計量器,均可化減法加法運算。模固定時,減去一個數,相當於加上一個數的補數。

如鐘錶數字模為12, 8的補數是46-8=10,用補碼錶示為:6+4=10。結果是相同的。

       在系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以了。把補數用到計算機數的處理上,就是補碼。

     

       補碼的總前提是機器數,不要忘了機器數的符號位含義,最高位為0表示正數,最高位為1表示負數,而最高位是指機器字長的最左邊一位。

求一個數補碼的方法:轉化為固定位寬二進位制數,正數補碼為原數;負數補碼需對該數先取反,後加一。

補碼規則:

(1)正數補碼

       正整數的補碼是其二進位制表示,與原碼相同。

【例1+9的補碼是00001001。(備註:這個+9的補碼是用82進位制來表示的,補碼錶示方式很多,還有16位二進位制補碼錶示形式,以及32位二進位制補碼錶示形式,64位進位制補碼錶示形式等。每一種補碼錶示形式都只能表示有限的數字。)

2)負數補碼

求負整數的補碼,將其對應正數二進位制表示所有位取反(包括符號位,

0110)後加1

同一個數字在不同的補碼錶示形式中是不同的。比如-15的補碼,在8位二進位制中是11110001,然而在16位二進位制補碼錶示中,就是1111111111110001。以下都使用82進位制來表示。

【例2】求-5的補碼。

-5對應正數500000101所有位取反(111110101(11111011)

所以-5的補碼是11111011

【例3】數0的補碼錶示是唯一的。

[+0]=[+0]=[+0]=00000000

[ -0]=11111111+1=00000000

3)轉化原碼

已知一個數的補碼,求原碼的操作其實就是對該補碼再求補碼:

如果補碼的符號位為“0”,表示是一個正數,其原碼就是補碼。

如果補碼的符號位為“1”,表示是一個負數,那麼求給定的這個補碼的補碼就是要求的原碼。

【例4】已知一個補碼為11111001,則原碼是10000111-7)。

因為符號位為“1”,表示是一個負數,所以該位不變,仍為“1”

其餘七位1111001取反後為0000110

再加1,所以是10000111

4)補碼的絕對值

【例5-65的補碼是10111111

若直接將10111111轉換成十進位制,發現結果並不是-65,而是191

事實上,在計算機內,如果是一個二進位制數,其最左邊的位是1,則我們可以判定它為負數,並且是用補碼錶示。

若要得到一個負二進位制補碼的數值,只要對補碼全部取反並加1,就可得到其數值。

如:二進位制值:10111111-65的補碼)

各位取反:01000000

101000001+65

       5)小數補碼

一種簡單的方式,符號位保持1不變,數值位從右邊數第一個1及其右邊的0保持不變,左邊按位取反。