以一般人邏輯理解數值的編碼:原碼,補碼,真值
數值的編碼:原碼,反碼,補碼
前言
1.雖然現在計算機有64位,但是為了簡單,本文介紹時以8位為例進行說明。
2.為了充分理清邏輯,本文放棄分類討論。
原理
規定符號位
現在有8個二進位制位,可以產生2的8次方種組態。為了儲存負數,將最高位拿出來,用0來表示正,1來表示負。那麼0000 0000到0111 1111表示正數,1000 0000到1111 1111來儲存負數。那麼產生一個問題?第一個負數用什麼來表示?
從第一個負數的編碼說起
正確的邏輯是0000 0000B表示數字0,那麼
0-1=0000 0000B -1B=1111 1111B
(你可能要說這不相等,因為
1 0000 0000B -1B=1111 1111B
我的解釋是我只有8位,不管這個數值實際是多少位的,可能是
1 0000 0000-1,11 0000 0000-1,
只要能借到位,對於我所擁有的8位就會是
1111 1111.
為了顧及它們的情況,所以
0000 0000B -1B=1111 1111B)
接下來的編碼就簡單了,
-1-1=1111 11111B-1B =1111 1110B
-1-2=1111 1111B -10B=1111 1101B
…
-128=1000 0000
這樣所有8位二進位制的組態都編碼完了。
如何求真值
對於正數,其補碼對應的十進位制數就是真值。對於負數,補碼真值的絕對值為該負數到0的距離,對這個絕對值取負就是真值。如果還不明白,不妨看看下面的兩個問題
為什麼負數的補碼是對應正數取反再加一
十進位制數正數的絕對值代表該正數到0點的距離,負數的絕對值代表該負數到0的距離。
那麼對一個8位二進位制數
正數的絕對值表示該正數到0000 0000B 的距離
如:0000 0001B到0000 0000B的距離為1B;
\,\,\,\,\,\,\,\,
0000 0010B到0000 0000B的距離為10B;
由於0000 0000 取反後為1111 1111,所以負數補碼的示數表示補碼到1111 1111的距離。如:
1111 1110B到1111 1111的距離為1B(距離為1);
1111 1101B到1111 1111的距離為10B(距離為2);
(可以用1111 1111B-1111 1110B算出來1,也可以用
低有效,0為真的想法來算出來1,1111 1110如果以0為真對應數字1,
1111 1101如果0為真對應數字2)
(有些時候換一種說法就可以縮短邏輯鏈,這是在學數電的時候用到的方法,替換1,真,高電平。說明一下希望能給讀者啟發)
再右移一位就得到補碼
如何根據補碼看出真值?根據真值看補碼?
1.求1111 1101B的真值,負數0為真,對應數字2,那麼距離-1為2,它的真值為-3.
2.求-3的補碼。
-1=1111 1111B
-1-2=1111 1111B-10B=1111 1101B
相關文章
- 原碼反碼補碼的相關理解
- 徹底理解原碼、補碼、反碼
- 理解二進位制原碼、反碼、補碼
- 編碼規範:不要用引數控制程式碼邏輯
- 定點數的原碼補碼除法
- Python寫業務邏輯的幾個編碼原則Python
- 深入理解計算機中的原碼、補碼、反碼計算機
- [計組] 計算機編碼方式:原碼、反碼、補碼計算機
- 原碼反碼補碼
- 原碼 反碼 補碼
- 原碼、反碼、補碼
- 原碼 補碼 反碼
- 原碼反碼與補碼
- 從原碼,反碼,補碼的設計理念來深入理解其原理
- 變數C++邏輯程式碼變數C++
- 關於原碼,反碼,補碼
- Java - 5 原碼、反碼、補碼Java
- 原碼, 反碼, 補碼 詳解
- 原碼,反碼,補碼相互轉換
- 計算機原碼, 反碼,補碼的介紹計算機
- 簡單看看原碼、補碼和反碼
- 動手動腦——原碼,反碼,補碼
- 碼農養成記4——原碼、反碼、補碼
- 如何編寫難以維護的 React 程式碼?耦合通用元件與業務邏輯React元件
- 培養程式碼邏輯
- 補碼、反碼、浮點數
- 反編譯之JD-GUI程式碼邏輯分析編譯GUI
- 二進位制原碼、反碼、補碼詳解
- expdp 邏輯備份指令碼指令碼
- 邏輯漏洞之密碼重置密碼
- 前端補充:url編碼前端
- 從模運算的角度看原碼和補碼
- 計算機二進位制中的原碼,反碼,補碼計算機
- 重新理解熵編碼熵
- cocos-creator 指令碼邏輯-1指令碼
- 密碼找回邏輯漏洞總結密碼
- 一文搞明白位運算、補碼、反碼、原碼
- 普通三進位制邏輯數學全部真值表全球公佈