1. 程式人生 > 其它 >關於機器數,真值,原碼,反碼,補碼的認識

關於機器數,真值,原碼,反碼,補碼的認識

1.機器數

通過了解機器數後發現:機器數包含了“原始碼”,“反碼”,“補碼”的表示形式;

因為機器數指的是一個數在計算機裡以二進位制表示的形式,機器數的首位是符號位,正數的符號位為“0”,負數的符號位為“1”

例如:5 的機器數是:00000101

          -5的機器數是:10000101 (以8位二進位制為例)

 而 “原始碼”,“反碼”,“補碼”具有同樣的表示形式,接下來會具體介紹它們的關係。

2.真值

真值指的是帶符號位的機器數對應的真實數值

對於真值而言,一般用十進位制表示,也可以用二進位制表示,很少用其他進製表示真值。

例如:10000101 的真值= -0000101 = -5

           00000101 的真值= +0000101 

=+5

3.使用原碼, 反碼和補碼的用途

對於一個數, 計算機要使用一定的編碼方式進行儲存;原碼, 反碼, 補碼是機器儲存一個具體數字的編碼方式。

4.原碼

原碼的表示形式就是第一位是符號位加上真值的絕對值。

例如:-000101(真值)= 10000101(原碼)

          00000101(真值)= 00000101(原碼)

因為第一位是符號位,所以原碼在8位二進位制的範圍為:

11111111~01111111  即    -127~127

原碼是最容易被大腦理解,計算的表示形式。

5.反碼

反碼就是在原碼的基礎上,如果是正數,就和原碼一樣,如果是負數,首位符號不變,其餘數值取反。

例如:00000101(原碼)=  00000101(反碼)

          10000101(原碼)=  11111010 (反碼)

反碼不容易被大腦理解,通常被轉換成原碼後計算。

6.補碼

補碼是在原碼的基礎上,如果是正數,就和原碼一樣,如果是負數,除首位符號外,其餘數值取反(反碼),在它的基礎上 +1。

例如:00000101(原碼)=  00000101(反碼)=  00000101(補碼)

          10000101(原碼)=  11111010 (反碼)=  10000011(補碼)

對於負數, 補碼錶示方式也是人腦無法直觀看出其數值的,通常也需要轉換成原碼再計算其數值。

7.使用原碼, 反碼和補碼的歷程

只使用原碼容易被理解,但是對於計算機而言要辨別首位正負,要消耗大量資源,於是人們尋找到了利用符號位參與運算的方法。

我們知道, 根據運演算法則減去一個正數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了。

探索計劃1.0(原碼):

1+ (-1) = 0

00000001(原碼)+10000001(原碼)=10000010(原碼)= -2

探索原碼計算首位計劃失敗

追加投資!

探索計劃2.0版本出世(反碼):

00000001(原碼)+10000001(原碼)= 00000001(反碼)+11111110(反碼)= 11111111(反碼)=10000000(原碼)= -0

更新說明:解決了首位符號參與運算的問題,很大程度上減少計算機對二進位制運算所消耗的資源,但是出現“0”和“-0”重複的情況,還可以改進!

探索計劃3.0版本出世(補碼):

00000001(原碼)+10000001(原碼)= 00000001(反碼)+11111110(反碼)= 00000001(補碼)+11111111(補碼)=00000000(補碼)=00000000(原碼)= 0

追加:(-1)+(-127)= (-128)

10000001(原碼)+11111111(原碼)= 11111110(反碼)+10000000(反碼)= 11111111(補碼)+10000001(補碼)=10000000(補碼)=-128

更新說明:解決了2.0版本存在的一個無意義的二進位制“-0”,對二進位制範圍進一步擴大由1.0版本的(-127~127)升級為(-128~127)同理也可以用於其他位的二進位制

例如:int有4個位元組32位,表示的範圍為(-2^31~2^31-1)

由於3.0版本更符合環保理念,所以作為計算機儲存二進位制的不二之選。