- 計算機是如何工作的:人人都能懂的計算機軟硬件工作原理
- (美)馬修·賈斯蒂斯
- 1929字
- 2024-04-25 18:07:36
1.6 十六進制
在結束用二進制思考這個話題之前,我還要提一下另一個數字系統:十六進制。我們“正常的”數字系統是十進制系統,或者說以10為基數的系統。計算機使用的是二進制系統,即以2為基數的系統。十六進制系統以16為基數!十六進制(縮寫為hex)系統也是一種位值系統,其中的每個位置都表示16的冪,每個位置的符號都可以是16個符號中的一個。
和所有的位值系統一樣,最右邊的位置仍是1的位置,其左邊第一位是16的位置,然后是256(16×16)的位置,之后是4096(16×16×16)的位置,以此類推。非常簡單!但是,每個位置可以放置的16個符號是哪些呢?通常,我們有表示數字0~9的10個符號。要表示其他值,還需要另外6個符號。我們可以隨機選擇一些符號,比如&、@和#,但是這些符號沒有明顯的順序。相反,采用A、B、C、D、E和F(大小寫均可)才是標準做法。在這個方案中,A代表10,B代表11,以此類推,直到F,它代表的是15。這樣是對的,我們需要一些符號來表示從0到基數減1的數字。因此,其他6個符號是A~F。為了清晰起見,標準的做法是用前綴0x來表示十六進制。表1-5列出了16個十六進制符號,以及它們十進制和二進制的值。
表1-5 十六進制符號

當需要表示的值大于十進制的15或十六進制的0xF時會怎么樣呢?和十進制一樣,我們增加一位。0xF的后面是0x10,這就是十進制的16。然后是0x11、0x12、0x13,以此類推。現在看一下圖1-4,便可以看到更大的十六進制數0x1A5。
圖1-4給出了十六進制數0x1A5,它的十進制值是多少呢?最右邊位置的值為5,旁邊位置的權重為16,位置上有個A,A代表十進制的10,因此,中間位置為16×10=160。最左邊位置的權重為256,位置上有個1,所以這個位置的值為256。總數值用十進制表示為5+160+256=421。

圖1-4 按位值分解十六進制數0x1A5
為了強調這一點,這個例子展示了像A這樣的新符號是如何根據其出現的位置而有不同的值的。0xA是十進制的10,0xA0則是十進制的160,因為A出現在16的位置上。
現在,你可能會說:“太棒了,但是這有什么用呢?”我很高興你有這樣的疑問。計算機不使用十六進制,大多數人也不使用。但是,十六進制對于那些要處理二進制數的人來說卻是很有用的。
使用十六進制有助于克服處理二進制數的兩個常見困難。首先,大多數人都不擅長閱讀較長的0/1序列。之后,這些位要一起運行。對于人類而言,處理16個或更多的位很困難且容易出錯。其次,盡管人類善于處理十進制數,但十進制和二進制之間的轉換并不容易。對于大多數人來說,很難在看到一個十進制數后,就能很快說出該數用二進制表示時哪些位是1,哪些位是0。但是,將十六進制轉換成二進制要簡單得多。表1-6給出了2個16位二進制數及其對應的十六進制與十進制表示。注意,為了清晰起見,我在二進制數值中添加了空格。
表1-6 16位二進制數及其十六進制和十進制表示

先看表1-6中的例1。它的二進制表示是個明確的序列:前4位全是1,之后的8位全是0,最后的4位全是1。從十進制角度來看,這個序列是模糊的。從61455來看,完全不清楚哪些位是0,哪些位是1。而十六進制序列是二進制序列的鏡像。第一個十六進制符號是F(即二進制中的1111),之后的兩個十六進制符號是0,最后一個十六進制符號是F。
接著看例2,前3個4位組都是1000,最后一個4位組是0001。這在二進制中看著很簡單,但在十進制中看著就很難了。十六進制提供了更清晰的表示,十六進制符號8對應于二進制的1000,十六進制符號1對應于0001!
我希望你能看出一種模式:二進制中每4位對應于十六進制中的1個符號。如果你還記得4位是半個字節的話,那么便可知道一個字節可以表示成兩個十六進制符號。一個16位的二進制數可以用4個十六進制符號表示,一個32位的二進制數用8個十六進制的符號表示,以此類推。讓我們以圖1-5中的32位二進制數為例。

圖1-5 每個十六進制符號映射為二進制中的4位
在圖1-5中,我們可以按每次半字節的節奏來消化這個相當長的數字,這是用十進制表示的相同數字(2320695040)無法辦到的。
由于二進制與十六進制之間的轉換相對容易,因此許多工程師通常會同時使用它們,只在必要時才會轉換成十進制。后續在有意義的情況下,本書將會使用十六進制。
嘗試不經過轉換成十進制的中間步驟,把二進制轉換成十六進制。
練習1-4:將二進制轉換成十六進制
把下列用二進制表示的數字轉換成等價的十六進制數。如果可以的話,不要先轉換成十進制。本題的目標是直接從二進制轉換成十六進制。
10(二進制)=______(十六進制)
11110000(二進制)=______(十六進制)
一旦你掌握了將二進制轉換成十六進制的方法,就嘗試一下從十六進制轉換成二進制。
練習1-5:將十六進制轉換成二進制
把下列用十六進制表示的數字轉換成等價的二進制數。如果可以的話,不要先轉換成十進制。本題的目標是直接從十六進制轉換成二進制。
1A(十六進制)=______(二進制)
C3A0(十六進制)=______(二進制)