計算機整數編碼系統
二進制
我們都知道現代計算機存儲和處理的信息都是以二進制的形式來表示的,在計算機中那些能看到的跟不能看到的東西都是由一個一個二進制位來表示的,而每一個位(bit)中儲存的值只能是0和1。
因爲在數字電路層面上用高低電平來表示數據有很大的便利性,因模擬電路極容易受到噪聲干擾,所以波形也會有較大的變化。而數字電路因爲只有高低電平,抗干擾能力強,所以也被越來越廣泛的應用到各種電子設備上。所以說爲什麼計算機內部的數據結構是以二進制的方式組織就是這個原因。
計算機中最小的儲存單位是位(bit)但是一個位往往作用不大,想要表示有實際意義,有實際作用的數就需要用多個位組合在一起來擴大數的表示範圍,在計算機中一般用8個位組成一個字節,一個字節就是計算機中的最小的尋址單位,也就是內存中最小的儲存空間分塊是8個位,即一個字節。
無符號整數的編碼
先來看看無符號整數的編碼,因爲無符號整數編碼比較符合人們的直觀感覺,所以一般要理解無符號數字的編碼並不會有什麼問題。無符號數的編碼可以用相應的十進制數一直除以2,然後把餘數放到低位(數最右邊就是低位)就可以得到相應的2進制數了。而這個二進制數也是計算機裏面的編碼方式。
上面公式D是十進制數,
下面我們來考慮無符號編碼的表示範圍,假設該二進制數有
從上兩式中也可以看出無符號數的一個很重要的性質,即介於
無符號編碼的值大小
下面是在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爲正數,這跟原碼,反碼一樣。
原碼中因爲不能在數學上直接參與運算,容易出錯。要計算的話必須符號位與其他位分開儲存計算,所以這無疑增加了系統開銷,所以原碼和反碼在現代計算機中很少採用這兩種編碼方案。
在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。
我們用函數
其中
下面來舉幾個例子來看看補碼如何運作
下面我們來考慮
補碼的值的大小
下面是在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 |
喜歡我們的內容,可以微信搜索公衆號
科學技術工作室或掃下面的二維碼關注我們