徹底理解原碼、補碼、反碼

。DragonSoul。發表於2020-11-13

徹底理解原碼、補碼、反碼


原碼、補碼、反碼的概念

為了簡單起見,我將以一個位元組(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得到補碼。


參考視屏:徹底理解原碼、反碼、補碼。

相關文章