天天看點

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示

本節書摘來自華章計算機《計算機系統:核心概念及軟硬體實作(原書第4版)》一書中的第3章,第3.4節,作者:[美] j. 斯坦利·沃法德(j. stanley warford)著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

前面章節中的二進制表示是整數表示,本節介紹另一種基數,将用于下一章中介紹的計算機。本章還将介紹這種計算機是如何存儲字母資訊的。

3.4.1十六進制

假定一個人有16根手指而不是10根。那麼發明阿拉伯數字時,會發生什麼情況呢?記得10根手指模式是從0開始,一直繼續發明新的符号1、2,直到倒數第二根手指9,接着在最後一根手指,把1和0結合在一起表示下一個數10。

如果是16根手指,當達到9時,仍然還剩下不少的指頭,必須繼續發明新的符号,這些額外的符号通常用英語字母表開頭的字母表示,是以以16為底(十六進制,或縮寫為hex)的計數是這樣的:

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示

當十六進制數字包含許多位時,計數就有點兒麻煩。思考從8be7、c9d和9ffe開始接下來的5個數字:

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示

當寫八進制數時,數字看上去有比它們實際要大的趨勢;寫成十六進制數時,效果是相反的,數字有看上去比它們實際要小的趨勢。比較十六進制數的清單和十進制數的清單,可以看出18(hex)實際上是24(dec)。

3.4.2基數轉換

在十六進制中,每個位置值都是比它低一位的位置值的16倍。十六進制轉換為十進制,可以簡單地把位置值乘以該位置的數字,并相加。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示

例3.24圖3-21給出了把8be7從十六進制轉換到十進制的過程。b的十進制值是11,e的十進制值是14。 □

從十進制轉換到十六進制的過程類似于從十進制轉換到二進制的過程,不過不是一個接一個地除以2,而是除以16,并儲存餘數的記錄,這些餘數就是轉換後的十六進制數。

對于小于255(dec)或ff(hex)的數,兩種進制互相轉換用圖3-22所示的表格是很容易做到的。表中的主體是十進制數,左列和頂行是十六進制數。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示
《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示

例3.25把9c(hex)轉換到十進制,檢視9行和c列找到156(dec);把125(dec)轉換到十六進制,在表的主體中找到125,從對應的左列和頂行得出7d(hex)。 □

如果計算機以二進制格式存儲資訊,那麼為什麼要學習十六進制呢?答案是,二進制和十六進制之間存在特殊關系,如圖3-23所示。4位有16種可能的組合,而正好有16個十六進制數字,每個十六進制數字代表這4位。

為了節約列印空間,位模式經常被寫成十六進制形式。一個16位機器的手冊可能會說某個記憶體位置包含01d3,這要比說它包含0000 0001 1101 0011簡短多了。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示

把無符号二進制轉換到十六進制,從最右邊開始把位劃分為每4個一組,給每組一個圖3-23對應的十六進制數字。把十六進制轉換到無符号二進制,簡單地把過程反過來即可。

例3.26寫出10位無符号二進制數10 1001 1100的十六進制形式,從最右邊的4位1100開始:

10 1001 1100(bin)=29c(hex) □

由于10位不能剛好分為4個一組,是以在圖3-23中查找最左邊的數字時,在前面加2個0。在本例中,最左邊的十六進制數字來自

10(bin)=0010(bin)=2(hex) □

例3.27對于14位單元

0d60(hex)=00 1101 0110 0000(bin)

注意,最末尾的十六進制0代表4個二進制0,而最高位的十六進制0隻代表2個二進制0。 □

把十進制轉換為無符号二進制,你可能想要用十六進制-十進制表作為中間步驟。通過查找圖3-22中的十六進制值,不用任何計算,再根據圖3-23把每個數字轉換為二進制即可。

例3.28對于6位單元,

29(dec)=1d(hex)=01 1101(bin)

轉換中的每一步都是一次簡單的查表。 □

在機器語言程式代碼或程式記錄中,幾乎不會把數字寫成有負号的十六進制形式,而是把符号位隐含地包含在十六進制表示的位模式中。你必須牢記十六進制隻是二進制序列的一個友善的縮寫,硬體隻存儲二進制值。

例3.29如果一個12位的記憶體位置包含f7a(hex),那麼通過思考下面的位模式可以得出十進制數。

f7a(hex)=1111 0111 1010(bin)

符号位是1,是以這個數是負數,轉換為十進制是

f7a(hex)=-134(dec)

注意,盡管可以解釋成一個負數,但是十六進制數不會寫成有負号的形式。 □

3.4.3字元

因為計算機記憶體是二進制的,是以字母字元必須要編碼後才能存儲到記憶體中。美國資訊交換标準代碼(american standard code for information interchange,ascii)是一個使用廣泛的字母字元二進制編碼。

ascii包含所有大寫和小寫的英文字母、10個數字和特殊符号(例如,标點)。它的一些符号是不能列印的,主要用于在計算機之間傳遞資訊或用于控制外圍裝置。

ascii是一種7位的編碼。因為7位有27=128種可能的組合,是以有128個ascii字元,圖3-24給出了所有這些符号。表中第一列是不可列印的符号,它們的意思列在表下,表中其餘部分是可列印的符号。

例3.30代表響鈴(bell)的序列000 0111使終端發出嘩嘩聲。另一個例子是一組指令,用于控制紙張列印機在新的一行起始開始列印。計算機發送一個回車符(cr,000 1101),再發送一個換行符(lf,000 1010),cr使得“列印頭”或光标回到紙張的左邊,lf使紙張往下走一行。 □

例3.30名字tom會以下列ascii形式存儲,

101 0100

110 1111

110 1101

如果将這個位序列發送到輸出終端,就會顯示“tom”。 □

例3.32街道位址52 elm會以下列ascii形式存儲,

011 0101

011 0010

010 0000

100 0101

110 1100

2和e之間的空格是一個獨立的ascii字元。 □

盡管ascii使用廣泛,但它絕對不是表示字元的唯一編碼。由于這種7位編碼沒有提供除英語外其他語言中常見的重音符号,是以它的使用是有限的。由于這個限制,是以對其做了擴充,使用8位來提供很多7位無法表示的重音符号。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.4十六進制和符号表示

圖3-24 美國資訊交換标準代碼(ascii)

但即便有了這個擴充仍不足以處理非拉丁字元。由于全球資訊交流的重要性,是以發明了一種稱為unicode(統一碼)的标準。unicode的目标是可以對世界上所有語言的符号進行編碼,甚至包括已經不再使用的古語言。unicode符号集合使用32位或4位元組。由于大多數的應用不會用到這些符号中的大多數,是以unicode标準制定了使用小于4位元組的技術。基本多文種平面(basic multilingual plane)包含常用的unicode字元,每個字元僅占用2位元組。用它來存儲1位元組的擴充ascii碼,所需存儲空間是其兩倍。不過基本多文種平面實際上包含了世界上所有的書面語言,包括阿拉伯語、亞美尼亞語、漢語、西裡爾語、希臘語、希伯來語、日語、韓語、叙利亞語、許多非洲語言,甚至加拿大土著語言模式。