整數的編碼與存儲方式

整數的編碼分爲原碼、反碼、和補碼。計算裏使用的是補碼的存儲方式。
首先,請讀者先記住下面的幾個概念。
1、 原碼
將一個整數轉換成二進制形式,就是其原碼。例如short a = 6;,a 的原碼就是0000 0000 0000 0110;更改 a 的值a = -18;,此時 a 的原碼就是1000 0000 0001 0010。

以一個字節作爲整數的存儲長度爲例子:
1=00000001
-1=10000001
1-1=1+(-1)=00000001+10000001=10000010=-2
結果錯誤,符號位無法參加運算。

通俗的理解,原碼就是一個整數本來的二進制形式。
2、 反碼
談到反碼,正數和負數要區別對待,因爲它們的反碼不一樣。

對於正數,它的反碼就是其原碼(原碼和反碼相同);負數的反碼是將原碼中除符號位以外的所有位(數值位)取反,絕對值取反。例如short a = 6;,a 的原碼和反碼都是0000 0000 0000 0110;更改 a 的值a = -6;,此時 a 的反碼是1111 1111 1111 1001。

以一個字節作爲整數的存儲長度爲例子:
1=00000001(反)
-1=11111110(反)
1-1=1+(-1)=00000001+11111110=11111111=-0
結果錯誤,反碼的錯誤出現了(+0)和(-0)上,在零的概念裏沒有正負之分。

3、 補碼
正數和負數的補碼也不一樣,也要區別對待。

對於正數,它的補碼就是其原碼(原碼、反碼、補碼都相同);負數的補碼是其絕對值反碼加 1。例如short a = 6;,a 的原碼、反碼、補碼都是0000 0000 0000 0110;更改 a 的值a = -6;,此時 a 的補碼是1111 1111 1111 1010。
以一個字節作爲整數的存儲長度爲例子:
1=00000001(補)
-1=11111111(補)
1-1=1+(-1)=00000001+11111111=1 00000000=0

可以認爲,補碼是在反碼的基礎上打了一個補丁,進行了一下修正,所以叫“補碼”。

原碼、反碼、補碼的概念只對負數有實際意義,對於正數,它們都一樣。
最後我們總結一下 6 和 -18 從原碼到補碼的轉換過程:
在這裏插入圖片描述
在計算機內存中,整數一律採用補碼的形式來存儲。這意味着,當讀取整數時還要採用逆向的轉換,也就是將補碼轉換爲原碼。將補碼轉換爲原碼也很簡單:先減去 1,再將數值位取反即可(或者直接取反加1)。

那麼有了原碼,計算機爲什麼還要用補碼呢?

來看看它們的運算情況。 假設字長爲 8 位 ,那麼原碼的運算方式爲:1 - 1 = 1 + ( -1 ) =(00000001) + (10000001) = (10000010) = -2,這顯然不正確。原碼在兩個整數的加法運 算中是沒有問題的,問題出現在帶符號位的負數身上。 原碼無法滿足運算要求,因此對除 符號位外的其餘各位逐位取反就產生了反碼。反碼的取值空間和原碼相同且一一對應。下面 是反碼的減法運算:1 - 1 = 1 + ( -1 )= (00000001) + (11111110) = (11111111) = ( -0 ) 有問 題。1 – 2 = 1 + ( -2 ) = (00000001) + (11111101) = (11111110) = ( -1 ) 正確。反碼的問題出 現在(+0)和(-0)上,因爲在人們的計算概念中零是沒有正負之分的。 再來看補碼的加減運算 如下:1 - 1 = 1 + (-1) = (00000001) + (11111111) = (00000000) = 0 正確。1 – 2 = 1 + (-2)
= (00000001) + (11111110) = (11111111) = ( -1 ) 正確。。

通過補碼的運算,可以看出補碼的設計目的是: ⑴使符號位能與有效值部分一起參加運算,從而簡化運算規則。 ⑵使減法運算轉換爲加法運算,進一步簡化計算機中運算器的線路設計。 此外,在補碼中用-128 代替了-0,所以沒有+0 和-0 之分,符合常理,所以補碼的表示範圍 爲: -128——0——127 共 256 個。 注意-128 沒有相對應的原碼和反碼,-128 的補碼爲:10000000。 -1的補碼11111111。無符號位255補碼爲11111111。
在這裏插入圖片描述

整數的存儲

整數的存儲分爲高位優先存儲(big-endian)和低位優先存儲(little-endian)。 高位優先存儲:高位首先存在低地址。 低位優先存儲:低位首先存在低地址。
在這裏插入圖片描述
在這裏插入圖片描述假設一個 32 位整數的值爲 25000。25000 的補碼爲: 0x 00 00 61 a8,共 4 個字節(注意到, 在十六進制中,2 個數爲一個字節),其中最左邊的 00 是最高位,然後依次爲 00 次高位, 61 次低位,a8 低位。 那麼在內存中如何存放這 4 個字節呢?也就是內存中的低地址是優 先存放最高位還是最低位呢? 下圖是這一個整數的低位優先和高位優先的存儲實例:
在這裏插入圖片描述
在上圖中,高位優先的系統中,會優先把高位的 00 存放在低地址;而低位優先的系統正好 相反,將低位 a8 優先存放在內存中的低地址。

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