徹底理解原碼、補碼、反碼
徹底理解原碼、補碼、反碼
原碼、補碼、反碼的概念
為了簡單起見,我將以一個位元組(8bit)來舉例說明。
正數:原碼、補碼、發碼都是原碼本身。
負數:原碼、補碼、發碼下面分別給出說明以及例子。
原碼:最高位表示符號位。最高位為0代表正數,最高位為1代表負數。
反碼:除了符號位不變,其他位取反,0變為1,1變為0。
補碼:反碼加1。
為什麼計算機要用補碼來表示數字
當我們在做減法運算時,需要用正數-正數。
但是當我們做減法運算時有可能遇到減不夠而需要借位的情況,這顯然比較麻煩的。但是我們將式子轉化為正數+(-正數),
將減法換為加法就簡單了許多,只需要考慮進位就可以了。所以我們只需要制定一套用於做加法運算的電路就可以了。(計算機中只有加法器,所以減法就是通過加法來完成的)。
原碼錶示數字的問題
在上圖中我們用一個圈來表示一個子節所能表示的所有數字的原碼,圖中相連的數字表示相加都為8個1的原碼,但是我們用原碼錶示數字,相加後的原碼並不相同。所有我們用原碼來表示數字,在正數+(-正數) 所得到的二進位制原碼相同,但是根據我們的計算得到的數字卻不相同。
補碼是如何消除原碼的問題
如果用反碼錶示數字在相加的時候我們知道相加結果都為8個1結果的反碼也都是相同的。但是我們觀察可以發現0的表示方法有+0和-0兩種表示方法。存在多對一,這是不允許的。
反碼是如何消除補碼的問題
為了解決0存在的多對一的情況,
所以我們將負數都順時針旋轉1個單位。將-0旋轉到+0的位置。這時0就只有唯一的表示方法了。這時我們發現結果都為8個1結果表示的補碼也都為-1。解決了多對一的情況。但是我們順時針旋轉後最後一位還空出一個位置,為了與127相加得到-1所以這個空我們填-128就能順利的得到我們的結果。
所以我們在求負數的補碼時常常就是用負數的原碼然後原碼再取反得到反碼,反碼再加一就得到了負數的補碼。
總結:
在計算機的設計中為了簡單,我們只設計了一套加法器,所以在計算減法時,將之轉化為正數+(-正數)
的形式計算。但是在原碼錶示數字時,在計算過程中我們得到的原碼的二進位制相同但根據我們的計算得到的答案確實不相同。所以我們引入了反碼,反碼雖然我們能得到的反碼的二進位制與我們計算出的答案也是相同的。但是出現了新的問題就是0有+0和-0,多對一的新問題。
最後我們通過將負數的反碼順時針旋轉一個單位,(反碼加1)
得到補碼,最後我們能得到的補碼的二進位制與我們計算出的答案也是相同的。所以我們表示數字時我們用補碼就能夠滿足計算機用一套相同的加法規則計算出正確的結果。
正數的補碼就是原碼。
負數的補碼先計算出原碼,然後計算反碼,再將反碼加1得到補碼。
參考視屏:徹底理解原碼、反碼、補碼。
相關文章
- 原碼反碼補碼的相關理解
- 理解二進位制原碼、反碼、補碼
- 原碼 補碼 反碼
- Java 原碼 反碼 補碼Java
- 原碼, 反碼, 補碼 詳解
- 關於原碼,反碼,補碼
- Java - 5 原碼、反碼、補碼Java
- 深入理解計算機中的原碼、補碼、反碼計算機
- 這樣給小白講原碼、反碼、補碼,幫她徹底解決困擾了三天的問題
- 動手動腦——原碼,反碼,補碼
- 【字元編碼】徹底理解字元編碼字元
- 從原碼,反碼,補碼的設計理念來深入理解其原理
- 二進位制的原碼、反碼、補碼
- 二進位制原碼、反碼、補碼詳解
- 計算機原碼, 反碼,補碼的介紹計算機
- 原始碼補碼反碼原始碼
- 原碼、反碼、補碼及移碼的作用與區別
- [計組] 計算機編碼方式:原碼、反碼、補碼計算機
- java 原碼、反碼、補碼計算 以及 取反(~)運算Java
- 從Java中的取反號‘~’看原碼,反碼,補碼Java
- 原始碼、反碼和補碼原始碼
- Java 原始碼,反碼和補碼Java原始碼
- 漫談計算機組成原理(八)原碼、補碼、反碼計算機
- 計算機二進位制中的原碼,反碼,補碼計算機
- 補碼、反碼、浮點數
- 7行程式碼,徹底行程
- 「從原始碼中學習」徹底理解Vue選項Props原始碼Vue
- 徹底理解OkHttp - OkHttp 原始碼解析及OkHttp的設計思想HTTP原始碼
- 徹底理解紅黑樹及JavaJDK1.8TreeMap原始碼分析JavaJDK原始碼
- 以一般人邏輯理解數值的編碼:原碼,補碼,真值
- 徹底解決Oracle中文亂碼Oracle
- 如何理解掩碼、反掩碼、萬用字元字元
- Android AsyncTask完全解析,帶你從原始碼的角度徹底理解Android原始碼
- 一文徹底吃透MyBatis原始碼!!MyBatis原始碼
- 一文徹底弄懂ArrayList原始碼原始碼
- 八段程式碼徹底掌握 PromisePromise
- 徹底解決程式亂碼問題
- 徹徹底底教會你使用Redux-saga(包含樣例程式碼)Redux