1. 程式人生 > >計算機中二進位制原碼、反碼、補碼的計算

計算機中二進位制原碼、反碼、補碼的計算

計算機中原碼、反碼、補碼

正數的 原碼 = 反碼 = 補碼

負數 反碼 = 數的絕對值按位取反(最高位符號位除外)

         補碼 = 反碼 +1

已知負數補碼求原碼

補碼取反(最高位符號位不取反)+1 = 原碼  (負數補碼的補碼=原碼)*取反的時候,最高位符號位不取反

最高位 符號位也要進位,進位後溢位

本文談論的都為有符號數。

這得從二進位制的原碼說起:

二進位制原碼最大為0111111111111111=215-1=32767

二進位制原碼最小為1111111111111111=-215-1=-32767
0和負00000000000000000=1000000000000000=0
所以,二進位制原碼錶示時,範圍是-32767-0

032767,因為有兩個零的存在,所以不同的數值個數一共只有216-1個,比16位二進位制能夠提供的216個編碼少1個。

但是計算機中採用二進位制補碼儲存資料。

正數編碼不變,從00000000000000000111111111111111依舊錶示032767

負數需要把除符號位以後的部分取反加1,即-32767的補碼為1000000000000001到此,再來看原碼的正0和負000000000000000001000000000000000,補碼錶示中,前者的補碼還是0000000000000000,後者經過非符號位取反加1後,同樣變成了0000000000000000,也就是正0和負0在補碼系統中的編碼是一樣的。但是,我們知道,16位二進位制數可以表示216個編碼,而在補碼中零的編碼只有一個,也就是補碼中會比原碼多一個編碼出來,這個編碼就是1000000000000000,因為任何一個原碼都不可能在轉成補碼時變成

1000000000000000所以,人為規定1000000000000000這個補碼編碼為-32768所以,補碼系統中,範圍是-3276832767因此,實際上,二進位制的最小數確實是1111111111111111,只是二進位制補碼的最小值才是1000000000000000,而補碼的1111111111111111是二進位制值的-1