C語言中的原碼、反碼和補碼


我們都了解2進制8進制和16進制的轉化

也知道了數據在內存中存儲的時候都是二進制的形式存儲的。

那么什么事原碼、反碼和補碼呢  其實他們都是二進制。只不過是二進制的不同的表現形式。

 

下面舉例子,例如:

1.原碼

最高位表示符號位。剩下的位數,是這個數的絕對值的二進制

就比方說 一個完整的int型變量在內存中占的是4個字節,32位的編譯器中 那么這時候他的二進制表示是00000000 00000000 00000000 00000000

所以

10的原碼就是00000000 00000000 00000000 00001010

那么負數的原碼就是例如

-10的原碼10000000 00000000 00000000 00001010

 符號位是第一位 0為正數 1為負數

 

2.反碼

正數的反碼和其原碼是一樣的

附屬的反碼就是在其原碼的基礎上 符號位不變 其他位取反。

10的反碼就是 00000000 00000000 00000000 00001010    和上面一樣

-10的反碼就是11111111 11111111 11111111 11110101     和上面1和0是相反的

 

3.補碼

正數的補碼就是其原碼

附屬的補碼就是在其反碼的基礎上+1

 

10的補碼就是00000000 00000000 00000000 00001010

-10的補碼就是 11111111 11111111 11111111 11111011

 

總結

10

    10的原碼:00000000 00000000 00000000 00001010

    10的反碼:00000000 00000000 00000000 00001010

    10的補碼:00000000 00000000 00000000 00001010

-10

    -10的原碼:00000000 00000000 00000000 00001010

    -10的反碼: 11111111 11111111 11111111 11110101

    -10的補碼: 11111111 11111111 11111111 11111011

 

任何數據都是以其二進制的補碼形式存儲在內存中的

為什么數據要以補碼的形式存儲呢?

因為計算機中只有加法沒有減法.為了更加低成本的計算出結果,所以使用補碼來存儲數據.

計算機中只有加法沒有減法.為了更加低成本的計算出結果,所以使用補碼來存儲數據.

 

下面我們看一個例子 這個例子也是我看的時候特別能幫助我理解的 清晰明了,例如 :

             3 + 2;

             3 - 2; 這個減法運算對於計算機而言它的理解是 3 + (-2); 1

 

    使用原碼計算.

    3的原碼    00000000 00000000 00000000 00000011

    -2的原碼   10000000 00000000 00000000 00000010

                ----------------------------------------------------

                   10000000 00000000 00000000 00000101 結果是1個負數明顯是不對的

 

 

    使用反碼計算.

    3 的反碼:  00000000 00000000 00000000 00000011

    -2的反碼:  11111111 11111111 11111111 11111101

                   --------------------------------------------------

                   00000000 00000000 00000000 00000000        0

 

    使用補碼計算

    3 的補碼:   00000000 00000000 00000000 00000011

    -2的補碼:   11111111 11111111 11111111 11111110

                   -------------------------------------------------

                    00000000 00000000 00000000  00000001       1

 

    注:使用補碼來做運算效率是最高的.


免責聲明!

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



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