機組--原碼、補碼、反碼、移碼
首先,對於正數而言,原碼=反碼=補碼
在開始下面內容前,做以下約定:\(X\)表示真值,\([X]_原\)表示原碼,\([X]_反\)表示反碼,\([X]_補\)表示補碼。並且您可能需要一定的將十進制數轉化為二進制數的基礎。
有符號數與無符號數
-
無符號數:整個機器字長的全部二進制均為數值位
如 :
\(X=+27\)
無符號數為:\(11011\)
-
有符號數:在"無符號數"的最高位添加符號位:
+:0,-:1如 :
\(X=+27\)
有符號數為:\(011011\)
\(X=-27\)
有符號數為:\(111011\)
原碼
機器數最高位表示符號,其余位表示該數的絕對值
如果規定了機器字長,而我們的原碼位數又不夠時,需要我們進行補零,之后再修改符號位。
具體的:
-
當為整數時:在有效數值最高位前面補零,不影響整體取值。之后將最高位修改為符號位
假定機器字長為8位
\(X=+27\) ,\([X]_原\):\(00011011\)
\(X=-27\) ,\([X]_原\):\(10011011\)
-
當為小數時:在有效數值最低位后面補零,不影響整體取值。之后再將最高位修改為符號位
假定機器字長為8位(定點小數表現形式可見下方"定點小數")
\(X=+0.625\),\([X]_原\):\([0.1010000]\)
\(X=-0.625\),\([X]_原\):\([1.1010000]\)
值得注意的是,真值0有兩種不同形式表達:\([+0]_原=[0000]、[-0]_原=[1000]\)
機器數的定點表示
-
定點小數:純小數,小數點
.位置在符號位之后、有效數值部分最高位之前。符號位:+:0、-:1,位於最前。這里的純小數指的是,整數部分為零。\(0.0101\) √、\(1.0101\) ×、
如:\([+0.625]_原 = [0.101]\)、\([-0.125]_原 = [1.001]\)
-
定點整數:純整數,小數點
.位置在有效數值位最低位之后。且在最前面用逗號,將整數部分與符號位隔開如:\([+27]_原\) = \(0,11011\)、 \([-27]_原\) = \(1,11011\)
反碼
對於正數,其反碼與原碼形式一致。
\([+27]_原=00011011\) => \([+27]_反\) = \(00011011\)
\([+0.625]_原=[0.1010000]\) => \([+0.625]_反=[0.1010000]\)
對於負數,將原碼的符號位保持不變,其余部分按位取反。
假定機器字長8位
\([-27]_原\) = \(10011011\) => \([-27]_反\) = \(11100100\)
\([-0.625]_原=[1.1010000]\) => \([+0.625]_反=[1.0101111]\)
補碼
原碼轉補碼:
對於正數,其補碼與原碼形式一致。
對於負數,在反碼的基礎上+1。
\([-27]_原\) = \(10011011\) => $ [-27]_補$= \([-27]_反+1\) = \(11100100\) +1 = \(11100101\)
\([-0.625]_原=[1.1010000]\) => \([-0.625]_補\) = \([-0.625]_反+1=1.0101111+1\) = \(1.0110000\)
另法一:
假設負純整數X,將其轉化為原碼共有二進制位數\(N+1\),則X補碼為:\([2^{N+1}-|X|]\)
如:X = -13 =\([-1101]\) => \([-1101]_原=[11101]\) ,其中二進制位數為 \(5\) => \(2^5=32\),
因此其 補碼為:\([X]_補=32-|-13| = 19 = [10011]\)
另法二:
對負定點小數的原碼X,從右往左掃描,尾數的第一個1及其右部的0保持不變,左部的各位取反,符號位保持不變。
如\([X]_原=[1.1110011000]\) =>1.0001101000
補碼轉原碼:
規則:對於負數,補碼的除符號位取反后+1
\([-13]_補=[10011]\) =>取反=>\([11100]\) =>+1=>\([-13]_原=[11101]\)
移碼
一個真值的移碼和補碼僅差一個符號位,將補碼符號位取反即可得到移碼。
附錄
一些碼的可表示范圍:
| \(n\) 位碼 | 最小值 | 最大值 |
|---|---|---|
| 無符號小數 | 0 | \(1-2^{-n}\) |
| 無符號整數 | 0 | \(2^n-1\) |
| 定點小數 | \(-(1-2^{-n})\) | \(1-2^{-n}\) |
| 定點整數 | \(-(2^{n}-1)\) | \(2^{n}-1\) |
| 原碼純小數 | \(-(1-2^{-(n-1)})\) | \(1-2^{-(n-1)}\) |
| 原碼純整數 | \(-(2^{(n-1)}-1)\) | \(2^{(n-1)}-1\) |
| 反碼純小數 | \(-(1-2^{-(n-1)})\) | \(1-2^{-(n-1)}\) |
| 反碼純整數 | \(-(2^{(n-1)}-1)\) | \(1-2^{-(n-1)}\) |
| 補碼純小數 | \(-1\) (比原碼多表示\(-1\)) | \(1-2^{-(n-1)}\) |
| 補碼純整數 | \(-2^n\) (比原碼多表示\(-2^n\)) | \(2^{(n-1)}-1\) |
