最近在看哈工大劉宏偉老師的《計算機組成原理》,總結其中關於有符號數的幾種表示法,順便感謝老師這麼好的公開課。
首先先明確兩個概念:
- 真值:帶符號的數,如+101,-101
- 機器數:符號數字化的數,如0101,1101
下面結束有符號數的四種表示法
1. 原碼錶示法
定義:
- 對於整數
[x]原={0,x2n−x2n>x≥00≥x>−2n
其中x爲真值,n爲整數的位數。
例子:
x=+1110[x]原=0,1110
x=−1110[x]原=24+1110=1,1110
這裏逗號用於分割符號位和數值部分,實際計算機存儲中不存在,下同。
- 對於小數
[x]原={x1−x1>x≥00≥x>−1
例子:
x=+0.1101x原=0.1101
x=−0.1101x原=1+0.1101=1.1101
這裏用小數點將符號位和數值位分隔開,下同
Note: [+0]原̸=[−0]原
優點: 簡單、直觀。
缺點: 沒有統一加減法(對於兩個數相加,如果用源碼錶示法,可能需要做加法可能需要做減法,對運算器而言比較麻煩。)
2. 補碼錶示法
優點: 統一加減法
定義:
- 對於整數
[x]補={0,x2n+1+x2n>x≥00>x≥−2n(mod2n+1)
其中x爲真值,n爲整數的位數。
例子:
x=+1010[x]補=0,1010
x=−1011000[x]補=27+1+(−1011000)=1,0101000
- 對於小數
[x]補={x2+x1>x≥00>x≥−1(mod2)
例子:
x=+0.1110[x]補=0.1110
x=−0.1100000[x]補=2+(−0.1100000)=1.0100000
Note[+0]補̸=[−0]補
求補碼的快捷方式:
當真值爲正時,補碼與原碼相同;當真值爲負時,補碼可用原碼除符號位外,按位取反,末位再加1得到。
通過補碼求原碼:
當真值爲正時,原碼與補碼相同;當真值爲負時,原碼可用補碼除符號位外,按位取反,末位再加1得到。
3. 反碼錶示法
定義:
- 對於整數
[x]反={0,x2n+1−1+x2n>x≥00≥x>−2n(mod2n+1−1)
其中x爲真值,n爲整數的位數。
例子:
x=+1101[x]反=0,1101
x=−1101[x]反=24+1−1+(−1101)=1,0010
- 對於小數
[x]反={x2−2−n+x1>x≥00>x≥−1(mod2−2−n)
其中x爲真值,n爲小數的位數。
例子:
x=+0.1101[x]反=0.1101
x=−0.1010[x]補=2−2−4+(−0.1010)=1.0101
Note: [+0]反̸=[−0]反
三種機器數小結
- 最高位爲符號位,書寫上用“,”(整數)或“.”(小數)將數值部分和符號位隔開。
- 對於正數,原碼=補碼=反碼
- 對於負數,符號位爲1,其數值部分將原碼數值部分按位取反末位加1—>補碼;原碼數值部分按位取反—>反碼。
4. 移碼錶示法