2 整數在計算機中的表示
參考文獻
計算機是使用二進位制來表示資訊,因為對於電路來說,表示1和0兩個狀態是非常容易實現的。若要使用二進位制來表示數值,則需要規定二進位制對數值進行編碼的規則,不同編碼規則下,同一串二進位制表示的數值可能不同。下面介紹幾種常見的整數編碼方式。
原碼最容易理解,對於有符號數,最高位是符號位,1表示負數,0表示正數,剩下的各個位乘其位權後相加就是對應的十進位制數;對於無符號數,沒有符號位。如下表:
二進位制編碼
有符號數
無符號數
二進位制編碼
有符號數
無符號數
000000
10008-0
000111
10019-1
001022
1010
10-2
001133
1011
11-3
010044
1100
12-4
010155
1101
13-5
011066
1110
14-6
011177
1111
15-7
原碼雖然簡單,但是計算機並沒有採用原碼作為其整數編碼方案,因為原碼有著一些侷限性:
移碼可由有符號數加乙個偏置常數得到,通常當編碼位數為n時,這個偏置常數通常取2n−
12^2n−1
或2 n−
1−12^-1
2n−1−1
,以4位編碼,bias = 24−
12^24−1
舉例,來看一下移碼的作用:
有符號數
移碼-8 (+2
32^3
23)0000
-7 (+2
32^3
23)0001……
0 (+2
32^3
23)1000……
+7 (+2
32^3
23)1111
可見移碼有如下的好處:
因為移碼比較大小實現容易,因此移碼被用來表示浮點數的階,這樣便於浮點數加減運算時的對階(比較大小)操作。
學過數位電路的應該知道,無符號的加法運算電路(加法器)是比較容易實現的。假如能夠有一種編碼規則,使得有符號數之間的加減運算規則可以統一到無符號數的加法運算規則(0+0=1;1+0=1;0+1=1;1+1=1,進製),那麼會給硬體設計帶來很大的好處。這種編碼規則存在嗎,怎麼找到它呢?從乙個簡單的例子開始:10 - 4 = 6
,用加法的形式表示就是10 + (-4) = 6
,對於正數暫時採用其原碼表示,看看針對負數該如何編碼。
用乙個表盤來表示0~2n−
12^2n−1
個數,加1就是順撥一格,減1就是倒撥一格,那麼10 - 4 = 6
可以這麼表示:
但現在我們只想做加法,不想做減法,也就是說只能順撥,不能倒撥,即便如此仍然能夠從刻度10撥到刻度6:
這樣豈不是說我們用12
的編碼來代替-4
就能將減法統一到加法?不妨用二進位制加加看:1010 + 1100 = 1 0110
,可見多了乙個進製,對應表盤就是越過了一次刻度0,只要把進製丟掉就能得到正確的結果。從十進位制角度來看,丟掉進製的行為可以看成是將加法的結果對2n2^
2n取模,對於本例就是(10 + 12) mod 2
42^4
24= 6。對於加法器來說,忽略進製是非常簡單的。看來我們的目標要實現了!
在宣布結果之前,不妨再來看看兩個負數相加是不是也符合我們的期待:0 + (-1) + (-1) = (-1) + (-1) = -2
:
至此,不難總結出,當我們使用n位編碼時,讓正數和0的編碼保持其原碼,讓負數的編碼為該負數加上2n2^
2n得到的正數的原碼,這種編碼規則就可以將加法和減法統一起來,進一步的,考慮到除法可以用減法來做,乘法可以用加法來做,可以將四則運算都統一到加法,這對硬體(運算電路)設計來說是非常有意義的。
為了不用對正負數分情況討論,我們需要乙個補碼的統一(對正負數皆適用)的定義,這個定義可以這麼表達:用n位二進位制數以補碼來編碼整數,可以編碼的整數範圍為[−2n
−1-2^−2
n−1, 2n−
12^2n−1
),對於x∈
\in∈[−2n
−1-2^−2
n−1, 2n−
12^2n−1
),其補碼[x]
補[x]_補
[x]補
=(x+2n2^
2n) mod 2n2^
2n=x mod 2n2^
2n的原碼。
當我們要計算某個整數的補碼時,直接從定義式出發比較麻煩,我們可以根據定義式得出一些規律。顯然,正數和0的補碼就是其原碼。對於負數,設-1
對應的正數為1
,-2
對應的正數為2
,依此類推,則負數的補碼為2n2^
2n減去其對應的正數後,得到的那個正數的原碼。以n為32為例,2n2^
2n=0xffff ffff + 1,而0xffff ffff與乙個正數相減,其實就是將該正數的每個二進位制位取反,因此負數的補碼是其對應正數的原碼按位取反後再加1。
相反,將補碼轉換為十進位制整數時,我們可以按位權來算:
當然,也可以根據上文總結出的轉換規律的逆過程來算:符號位為0,則直接當原碼轉換;符號位為1,則減1,再按位取反,之後再當原碼轉換。
考慮到補碼可以將減法統一到加法,有利於運算電路的實現,因此從上個世紀50年代開始,整數都採用補碼的形式在計算機中儲存及運算。
[1] 南大袁春風教授的計算機系統基礎課程
計算機系統基礎
includeint main return 0 如果將表示式換成 2147483647 1 2147483647 結果又會怎麼樣呢 編譯器如何處理字面量 高階語言中運算規則 高階語言與指令之間的對應 機器指令的執行過程 機器級資料的表示和運算 sum int a unsigned int len ...
計算機系統結構 計算機 計算機系統的基本結構
乙個完整的計算機系統是由計算機硬體系統和計算機軟體系統兩部分組成。硬體是計算機的實體,又稱為硬裝置,是所有固定裝置的總稱。它是計算機實現其功能的物質基礎,其基本配置可分為 主機 鍵盤 顯示器 光碟機 硬碟 軟盤驅動器 印表機 滑鼠等。軟體是指揮計算機執行的程式集,按功能分系統軟體和應用軟體。1 由運...
計算機系統
一陰一陽之為道。早在幾千年我國古人就知道天地萬物皆由正反兩個東西組成的。自從人類進入電氣時代,隨著電子元件的快速發展,各種裝置隨之誕生了。一些元件 例如閘流體 可以根據電壓的高低變化自行導 通或者關斷。如果是高電壓導通,就規定是1 低電壓導通規定是0,那麼眾多的這些元件組成的乙個整體就可以0 和1來...