源碼 反碼 補碼 分析

1、原碼錶示法
0--正數   1--負數  對於n+1位的二進制數(包括符號位)

對於定點整數

當X>0時,原碼錶示爲X,這個很好理解

當X<0時,X的原碼是在|X|(即-X)的二進制碼的符號位(即首位)將0改爲1,所以數值上是相當於在|X|的大小上加上一個2^n,圖示中X爲負數,所以減去一個負數等於加上該數的絕對值,2^n-X正是我們推導的。                

需要注意的地方:舉個例子,我們假設現在X= -1,其原碼是1,001(一共四位包括符號位),根據上圖公式,所以X的原碼大小應該爲2^n-X即2^3 -(-1)= 9  即 1,001。

好,問題就出現在這裏,你算出來的數值大小是9,然而這個9所代表的二進制碼卻是-1,so,你理清楚邏輯了嗎?

實際上我們公式推導出的是指這個數的二進制大小,其最高位我們不認爲是符號位,而在原碼的真正表達過程中,則將最高位的視爲符號位,這就是衝突所在,當你用數學公式表示這個碼值大小時,是直接將其看爲一串二進制數的大小,符號默認爲正,而這個無符號的數值大小則剛好對應有符號的負數原碼。

對於定點小數

當X>0時,原碼錶示爲X

 當X<0時,同理X的原碼是在|X|(即-X)的二進制碼的符號位(即首位)將0改爲1,所以數值上是相當於在|X|的大小上加上一個1,圖示中X爲負數,所以減去一個負數等於加上該數的絕對值,1-X正是我們推導的。

稍微解釋下:對於n+1位的定點整數,去除符號位後有n位,能表示2^n個數,因爲0要佔一種情況,所以只能表示從0到2^n-1共2^n個數,所以最大爲2^n-1,同理對於負數,注意原碼有正零與負零。

對於n+1位定點小數,去除符號位後有n位,最大的數爲0.11111……1(n個1),因爲0.11111……1(n個1) + 0.00000(n-1個0)1 = 1  所以最大數爲1 - 0.0000(n-1個0)1即1-2^(-n),同理對於負數

2、反碼錶示法
對於n+1位的二進制數(包括符號位)

                         

簡單來說,正數的反碼與正數的原碼相等,負數的反碼與負數絕對值的原碼取反相等。

我們來考慮下取反怎麼用數學方式描述,假定有個數爲-7,二進制位10000111(8位,最高位爲符號位),取反後應該爲01111000,其實可以把它看做爲被11111111減後得到。即

                     11111111

                -    01111000

---------------------------------------------

                     10000111

11111111實際上數值大小爲2^8-1=255   即對於n位的整數X,對其取反,相當於2^n-1 - X   

下面考慮下小數取反如何用算式描述,假定有個小數爲0.0000001,取反後應該爲1.11111110,可以看做其取反後是被1.11111111減去後得到的。即

                     1.1111111

                -    0.0000001

---------------------------------------------

                     1.1111111

1.1111111= 1 + 0.1111111        數值大小爲1 + (1-2^(-7)) = 2-2^(-7)   即對於n位的小數X,對其取反,相當於2-2^(-(n-1)) - X


對於定點整數

當X>0時,X的反碼等於X的原碼,表示爲X。

當X<0時,X的反碼是等於對|X|(即-X)取反,對於n+1位的二進制數負數X,取反後數值大小爲2^(n+1)-1- |X|,去除絕對值,得到反碼的數值大小爲 2^(n+1)-1 + X

對於定點小數

當X>0時,X的反碼等於X的原碼,表示爲X。

當X<0時,X的反碼是等於對|X|(即-X)取反,對於n+1位的小數X,對其取反,相當於2-2^(-n) -|X|,去除絕對值,得到反碼的數值大小2-2^(-n) +X

3、補碼錶示法
對於n+1位的二進制數(包括符號位)


簡單來說,正數的補碼與正數的原碼相等,負數的補碼等於負數補碼在末位加1,即負數絕對值的原碼取反後末位加1。

對於定點整數

當X>0時,X的補碼等於X,與原碼相同

當X<0時,X的補碼等於|X|取反後末位加一,|X|的取反,套用上面已推的公式爲2^(n+1)-1 +X。末位加一,即數值再加上一,最後補碼爲2^(n+1) +X

對於定點小數

當X>0時,X的補碼等於X

當X<0時,X的補碼等於|X|取反後末位加一,|X|的取反,套用上面已推的公式爲2-2^(-n) +X,末位加一,即數值上加上了0.0000000...(n-2個0) 1,爲2^(-n),所以最後補碼爲2+X

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章