正確理解原碼反碼補碼移碼


 

為了正確表示二進制下負數。
即用一個正二進制數表示一個負二進制數(即一個映射)。

如何實現|簡要解釋

在這里簡單的解釋一下,下下一個標題會較深入解釋 :)
設一負數為 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之前的個位取反,變成正數的補碼,再轉換成真值

注意編碼轉為真值時,先按最高位判斷正負。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM