為了正確表示二進制下負數。
即用一個正二進制數表示一個負二進制數(即一個映射)。
如何實現|簡要解釋
在這里簡單的解釋一下,下下一個標題會較深入解釋 :)
設一負數為 X,設 n 為 |X| 的二進制位數。接下來為 X 找一個對應的正數。
原碼:對 |X| 加上一個最高位 1 代表符號位,表示 X 為一負數。
移碼:對 X 加上一個常數 2^(n-1),把 X 本身轉換為一個正數,再以正數編碼。
反碼:對 X 取 2^n-1 的模(按位取反,方便運算),用模的結果(一個正數)表示 X 。
補碼:對 X 取 2^n 的模(即按位取反再加 1 ),用模的結果(一個正數)表示 X 。
為何如此
原碼:
沒什么好解釋的,加上一個最高位來表示此數為負數。
移碼:
也沒什么好解釋的,加上一個被稱為偏置常數( bias )的數 2^(n-1),使負數 X 本身變為正數。
反碼:
實際上機器是對 |X| 按位取反,所以機器做此操作還是相當快的。
用數學語言表達就是 X 取 2^n-1 的模。
即用一個全部是1的n-1位的二進制數 減去 |X| ,得到 X 的反碼表示。
所以 X 的反碼加 |X| 就是一個全部為1的n-1位二進制數。
例:
[-5] = ( 2^4-1 ) - | 0101 | = 1010
[-7] = ( 2^4-1 ) - | 0111 | = 1000
補碼:
補碼這樣做的原因是二進制的加減可直接運算,運算的結果和真值的運算結果相同。
機器對 |X| 按位取反然后加 1。
數學表達為 X 對 2^n 取模。
即用 2^n 減去 |X| ,得到 X 的補碼表示。
所以 X 的補碼加 |X| 就是一個 2^n 二進制數,由於最高位被計算機截斷,結果為 0。
例:
[-5] = 2^4 - |0101| = 1011
[-7] = 2^4 - |0111| = 1001
真值和編碼之間的轉換
除移碼外的編碼,最高位都可表示此數的正負情況。(即 0正1負)
移碼較為簡單,故不列出。
原碼:
由一個數符位和數值部分組成。
數學公式如下
真值轉為編碼 | 編碼轉為真值 | |
---|---|---|
正數 | 直接轉換 | 直接轉換 |
負數 | 絕對值轉換后,設最高位為1 | 數值部分直接轉換,添上負號 |
注意編碼轉為真值時,先按最高位判斷正負。
反碼:
數學公式如下
真值轉為編碼 | 編碼轉為真值 | |
---|---|---|
正數 | 直接轉換 | 直接轉換 |
負數 | 絕對值按位取反 | 按位取反再轉換,添上負號 |
注意編碼轉為真值時,先按最高位判斷正負。
補碼:
在補碼的轉換中,我們可以按照公式求真值,也可以通過一些簡單操作進行轉換。
真值轉為編碼 | 編碼轉為真值 | |
---|---|---|
正數 | 直接轉換 | 直接轉換 |
負數 | 先轉換為正數的補碼,再從右向左,第一個1之前的個位取反,變成負的補碼 | 從右向左,第一個1之前的個位取反,變成正數的補碼,再轉換成真值 |
注意編碼轉為真值時,先按最高位判斷正負。