以一般人邏輯理解數值的編碼:原碼,補碼,真值

小歪**發表於2020-11-13

前言

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

相關文章