計算機整數編碼系統

計算機整數編碼系統


二進制

我們都知道現代計算機存儲和處理的信息都是以二進制的形式來表示的,在計算機中那些能看到的跟不能看到的東西都是由一個一個二進制位來表示的,而每一個位(bit)中儲存的值只能是0和1。
因爲在數字電路層面上用高低電平來表示數據有很大的便利性,因模擬電路極容易受到噪聲干擾,所以波形也會有較大的變化。而數字電路因爲只有高低電平,抗干擾能力強,所以也被越來越廣泛的應用到各種電子設備上。所以說爲什麼計算機內部的數據結構是以二進制的方式組織就是這個原因。
計算機中最小的儲存單位是位(bit)但是一個位往往作用不大,想要表示有實際意義,有實際作用的數就需要用多個位組合在一起來擴大數的表示範圍,在計算機中一般用8個位組成一個字節,一個字節就是計算機中的最小的尋址單位,也就是內存中最小的儲存空間分塊是8個位,即一個字節。


無符號整數的編碼

先來看看無符號整數的編碼,因爲無符號整數編碼比較符合人們的直觀感覺,所以一般要理解無符號數字的編碼並不會有什麼問題。無符號數的編碼可以用相應的十進制數一直除以2,然後把餘數放到低位(數最右邊就是低位)就可以得到相應的2進制數了。而這個二進制數也是計算機裏面的編碼方式。

D=i=0w1xi2i

上面公式D是十進制數,xi 爲第i位二進制數,所以說二進制轉換成十進制只要把二進制每一位乘以相應的位權再相加就是相應的十進制數了。
下面我們來考慮無符號編碼的表示範圍,假設該二進制數有w 位,則該二進制數總共可以表示2w 個數,但是因爲這種表示情況考慮了全部w 位都爲零的情況,所以相應的數的表示範圍就要減一,即[0,2w1] 。也可以這樣理解,二進制最大的值必然所有位都爲1,所以即爲
DMax=i=0w12i=2w1

從上兩式中也可以看出無符號數的一個很重要的性質,即介於[0,2w1] 之間的數都有唯一對應的一個二進制w 位的二進制數,用數學語言來說就是二進制跟十進制的轉換函數是一個雙射。

無符號編碼的值大小

下面是在C\C++中無符號基本數據類型的最小值跟最大值(64位機器)

數據類型 最小值 最大值
unsigned char 0 255
unsigned short 0 65 535
unsigned int 0 4 294 967 295
unsigned long 0 18 446 744 073 709 551 615

(因爲機器不同和編譯環境不同上面這些值要根據機器和編譯環境來實際考慮,上表是針對一般64位CPU和系統)。


有符號整數的編碼(補碼)

從上一節也可以看出來計算機無符號整數的編碼是多麼的自然,直觀,很容易就能被理解接受。但是無符號的編碼畢竟只能編碼無符號數,但是日常生活生產裏面必然會有很大一部分要用到負數的,那麼負數在計算機裏面是怎樣被編碼的出來的呢?

原碼,反碼,和補碼

原碼:原碼錶示是最簡單的,第一位爲符號位其餘位爲相應的數值即10000001爲-1。

反碼:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。

補碼:也是第一位爲符號位,符號位1爲負數,0爲正數,這跟原碼,反碼一樣。

原碼中因爲不能在數學上直接參與運算,容易出錯。要計算的話必須符號位與其他位分開儲存計算,所以這無疑增加了系統開銷,所以原碼和反碼在現代計算機中很少採用這兩種編碼方案。

在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。
我們用函數

Dsigned(x⃗ )=xw12w1+i=0w2xi2i

其中x⃗  爲二進制爲w 位的向量形式,其中的分量只能是0和1。上式可以看到最高位爲符號位,最高位xw1 位1即爲負數,爲零即剩下第二項的正數部分w2i=0xi2i

下面來舉幾個例子來看看補碼如何運作

Dsigned([0001])=023+022+021+120=0+0+0+1=1Dsigned([0101])=023+122+021+120=0+4+0+1=5Dsigned([1011])=123+022+121+120=8+0+2+1=5Dsigned([1111])=123+122+121+120=8+4+2+1=1

下面我們來考慮w 位補碼所能表示的範圍,上面的式子所能表示的最小值是最高位爲1,其他位均爲零的時候即Dmin=2w1 。而最大值是最高位(符號位)爲0,其他位均爲1時,即Dmax=w2i=02i=2w11 。所以一個w 位的二進制數可以表示的有符號數值範圍是[2w1,2w11] 。而且二進制和十進制之間的轉換函數在數學上也是滿足雙射(一一對應)。注意到補碼錶示的表示範圍是不對稱的,正數比負數要少一個,爲什麼會這樣,是因爲有一半的位要表示負數(符號位爲1),另一半的位要表示正數(符號位爲0),而且因爲0是非負數所以沒有被編碼到負的一邊,而且被編碼到了正的一邊,所以就要減去0的那一個數,所以正數範圍就要減1。

補碼的值的大小

下面是在C\C++中無符號基本數據類型的最小值跟最大值(64位機器)

數據類型 最小值 最大值
char -128 127
short -32 768 32 767
int -2 147 483 648 2 147 483 647
long -9 223 372 036 854 775 808 9 223 372 036 854 775 807

喜歡我們的內容,可以微信搜索公衆號
科學技術工作室或掃下面的二維碼關注我們
公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章