- 大學計算機基礎(第2版)
- 蔡明 王中剛 李永杰
- 4791字
- 2020-09-03 10:14:51
1.2 數制與編碼
1.2.1 數據的存儲
在計算機內部,一切數據都是用二進制數的編碼來表示的。為了衡量計算機中數據的量,人們規定了一些表示數據的基本單位:位、字節和字。
位是計算機中存儲數據的最小單位,指二進制數中的一個位數,其值為“0”或“1”,即一個最小的基本單元電路;其英文名為“bit”,又稱為“比特”。
字節是計算機存儲容量的基本單位,計算機存儲容量的大小是用字節的多少來衡量的。其英文名為“Byte”,通常用“B”表示。字節經常使用的單位還有 KB(千字節)、MB(兆字節)和GB(千兆字節)等,它們與字節的關系是:
1 B = 8 bit
1 KB =210B=1024 B
1 MB =210×1 KB=210×210B=1024×1024 B=1024 KB
1 GB =210×1 MB=210×210×1 KB=210×210×210B=1024×1024×1024 B = 1024 MB
1 TB =210×1 GB=210×210×1 MB=210×210×210×1 KB=210×210×210×210B=1024×1024×1024×1024 B= 1024 GB
通常,一個ASCII碼用1個字節表示,一個漢字的國標碼用2個字節表示,整數型用2個字節表示,單精度實型數用4個字節表示,雙精度實型數用8個字節表示等。
字是計算機內部作為一個整體參與運算、處理和傳送的一串二進制數,其英文名為“字”(Word)。字是計算機內CPU進行數據處理的基本單位。
字長是計算機CPU一次處理數據的實際位數,是衡量計算機性能的一個重要指標。字長越長,計算機一次可處理的數據二進制位越多,運算能力就越強,計算精度也越高。目前,計算機字長有8位、16位、32位和64位,通常我們所說的N位的計算機是指該計算機的字長有N位二進制數。例如,486微機內部總線的字長是32位,被稱為32位機,則486計算機一次最多可以處理32位數據。
1.2.2 常用數制
1.數制定義
用一組固定的數字和一套統一的規則來表示數目的方法稱為數制。數制有進位計數制與非進位計數制之分,目前一般使用進位計數制。
進位計數制采取“逢N進一”原則,并采用進制三要素來表示,即基數、位權和數值。N 是指進位計數制表示一位數所需要的符號數目,稱為基數。處在不同位置上的數字所代表的值是確定的,這個固定位上的值稱為位權,簡稱“權”。各進位制中位權的值恰巧是基數的若干次冪。因此,任何一種數制表示的數都可以寫成按權展開的多項式之和。
設一個基數為r的數值N,N = (dn?1dn?2…d1d0d?1…d?m),則N的展開為

例如,十進制數2345.67的展開式為

計算機中常使用二進制、十進制、八進制、十六進制等。
2.十進制
十進制數的數碼為 0、1、2、3、4、5、6、7、8、9 共十個,進位規則為逢十進一,借一當十。若設任意一個十進制數D,有n位整數、m位小數:Dn?1 Dn?2…D1 D0 D?1…D?m,權是以10為底的冪,則該十進制數的展開式為

3.二進制數
二進制數的數碼為0、1,共兩個,進位規則為逢二進一,借一當二。若設任意一個二進制數B,有n位整數、m位小數:Bn?1 Bn?2…B1 B0 B?1…B?m,權是以2為底的冪,則該二進制數的展開式為

4.八進制數
八進制數的數碼為0、1、2、3、4、5、6、7共8個,進位規則為逢八進一,借一當八。若設任意一個八進制數Q,有n位整數、m位小數:Qn?1 Qn?2…Q1 Q0 Q?1…Q?m,權是以8為底的冪,則該八進制數的展開式為

5.十六進制數
十六進制數的數碼為0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16個,其中數碼 A、B、C、D、E、F 分別代表十進制數中的 10、11、12、13、14、15,進位規則為逢十六進一,借一當十六。若設任意一個十六進制數H,有n位整數、m位小數:Hn?1Hn?2…H1 H0 H?1…H?m,權是以16為底的冪,則該十六進制數的展開式為

1.2.3 數制進制與轉換
1.十進制數、二進制數、八進制數和十六進制數的對應關系
十進制數、二進制數、八進制數和十六進制數的對應關系如表1.1所示。
表1.1 各種進制數碼對照表

2.二進制、八進制、十六進制數換算成十進制數
二進制、八進制、十六進制數換算成二進制數的方法最為簡單,即將二進制、八進制或十六進制數按權展開相加即可以得到相應的十進制數。
例如,將二進制數(1011.011)2、八進制(264.48)8和十六進制數(212.A)16轉算成十進制數的方法分別為:
(1011.011)2=1×23+0×22+1×21+1×20+0×2?1+1×2?2+1×2?3=(11.875)10
(264.48)8=2×82+6×81+4×80+4×8?1+4×8?2=(183.5625)10
(212.A)16=2×162+1×161+2×160+10×16?1=(530.625)10
3.十進制數換算成二進制、八進制、十六進制數
由于將十進制數換算成二進制、八進制或十六進制數的方法基本相同,所以將其一并介紹,且有易于記憶。為方便敘述,下面將二進制、八進制、十六進制統稱為n進制。
十進制數轉換算成n進制數,因其整數部分和小數部分的換算方法不相同,所以相應地分整數部分的換算和小數部分的換算。
(1)整數部分的換算
將已知的十進制數的整數部分反復除以n(n為進制數,取值為2、8、16,分別表示二進制、八進制和十六進制),直到商是0為止,并將每次相除之后所得到的余數按次序記下來,第一次相除所得的余數K0為n進制數的最低位,最后一次相除所得余數Kn?1為n進制數的最高位。排列次序為Kn?1Kn?2…K1K0的數就是換算后得到的n進制數。
(2)小數部分的換算
將已知的十進制數的純小數(不包括乘后所得整數部分)反復乘以 n,直到乘積的小數部分為0或小數點后的位數達到精度要求為止。第一次乘n所得的整數部分為K?1,最后一次乘n所得的整數部分為K?m,則所得n進制小數部分0.K?1K?2…K?m。
若要將十進制數(268.48)10換算成二進制數、八進制數或十六進制數,則只需要將其整數部分和小數部分分別轉換成二進制數、八進制數或十六進制數,最后將其結果組合起來即可。
所以有:
(268.48)10=(100001100.01111)2
(268.48)10=(414.36560)8
(268.48)10=(10C.7AE14)16
4.二進制數與八進制數的相互換算
因為二進制的進位基數是 2,而八進制的進位基數是 8。所以三位二進制數對應一位八進制數。
二進制數換算成八進制數的方法是:以小數點為基準,整數部分從右向左,三位一組,最高位不足三位時,左邊添0補足三位;小數部分從左向右,三位一組,最低位不足三位時,右邊添0補足三位。然后將每組的三位二進制數用相應的八進制數表示,即得到八進制數。
例如,將二進制數(1101011011.0101)2換算為八進制數的方法為:
001 101 011 011.010 100
1 5 3 3 .2 4
所以,(1101011011.0101)2=(1533.24)8
八進制數換算成二進制數的方法是:將每一位八進制數用三位對應的二進制數表示。
例如,將八進制數(217.36)8換算為二進制數的方法為:
2 1 7 .3 6
010 001 111.011 110
所以,(217.36)8= (100011110.01111)2
5.二進制數與十六進制數的相互換算
因為二進制的基數是 2,而十六進制的基數是 16。所以四位二進制數對應一位十六進制數。
二進制數換算成十六進制數的方法是以小數點為基準,整數部分從右向左,四位一組,最高位不足四位時,左邊添0補足四位;小數部分從左向右,四位一組,最低位不足四位時,右邊添0補足四位;然后將每組的四位二進制數用相應的十六進制數表示,即可以得到十六進制數。
例如,將二進制數(100111111101111011.0111101)2換算成十六進制數的方法為
0010 0111 1111 0111 1011. 0111 1010
2 7 F 7 B. 7 A
所以,(100111111101111011.0111101)2= (27F7B.7A)16
十六進制數換算成二進制數的方法是:將每一位十六進制數用四位相應的二進制數表示。
例如,將十六進制數(3E4F.A9)16轉換為二進制數的方法為
3 E 4 F. A 9
0011 1110 0100 1111. 1010 1001
所以,(3E4F.A9)16= (11111001001111.10101001)2
以上討論可知,二進制與八進制、十六進制的轉換比較簡單、直觀。所以在程序設計中,通常將書寫起來很長且容易出錯的二進制數用簡捷的八進制數或十六進制數表示。
1.2.4 信息編碼
數據編碼就是規定用什么樣的二進制碼來表示字母、數字及專用符號。計算機系統中,有兩種字符編碼方式:ASCII碼和EBCDIC碼。ASCII碼使用最為普遍,主要用在微型機與小型機中,而EBCDIC代碼(Extended Binary Coded Decimal Interchange Code,擴展的二—十進制交換碼)主要用在IBM的大型機中。
1.ASCII碼
目前,國際上使用的字母、數字和符號的信息編碼系統是采用美國標準信息交換碼(American Standard Code for Information Interchange),簡稱為ASCII碼。它有7位碼版本和8位碼版本兩種。
國際上通用的ASCII碼是7位碼(即用七位二進制數表示一個字符)??偣灿?28個字符(27= 128),其中包括:26個大寫英文字母,26個小寫英文字母,0~9共10個數字,34個通用控制字符和32個專用字符(標點符號和運算符)。具體編碼如表1.2所示。
表1.2 7位ASCII碼表

要確定某個數字、字母、符號或控制符的ASCII碼,可以在上表中先查到它的位置,然后確定它所在位置的相應行和列,再根據行確定低4位編碼(b4b3b2b ),根據列確定高3位編碼(b7b6b5),最后將高3位編碼與低4位編碼合在一起(b7b6b5b4b3b2b1)就是要查字符的ASCII碼。例如,查表得到字母R的ASCII碼為1010010。
同樣,也可以由ASCII碼通過查表得到某個字符。例如,有一字符的ASCII碼是1100001,則查表可知,它是小寫字母a。
需要特別注意的是,十進制數字字符的 ASCII 碼與它們的二進制數值是不同的。例如,十進制數 5 的七位二進制數是(0000101),而十進制數字字符“5”的 ASCII 碼為(0110101)2=(35)16= (53)10。由此可見,數值5與數字字符“5”在計算機中的表示是不同的。數值5可以表示數的大小,并參與數值運算;而數字字符“5”只是一個符號,不能參與數值運算。
2.BCD碼
二進制具有很多優點,所以計算機內部采用二進制數進行運算。但二進制讀起來不直觀,人們希望用十進制數進行輸入,在計算機內部用二進制運算,輸出時再將二進制數轉換成十進制數。通常將十進制數的每一位寫成二進制數,這種采用若干位二進制數碼表示一位十進制數的編碼方案,稱為二進制編碼的十進制數,簡稱為二—十進制編碼,即 BCD 碼。BCD碼的編碼方案很多,其中8421碼是最常用的一種。
3.漢字編碼
漢字處理系統對每種漢字輸入方法規定了輸入計算機的代碼,即漢字外部碼(又稱輸入碼),由鍵盤輸入漢字時輸入的是漢字的外部碼。計算機識別漢字時,要把漢字的外部碼轉換成漢字的內部碼(漢字的機內碼)以便進行處理和存儲。為了將漢字以點陣的形式輸出,計算機還要將漢字的機內碼轉換成漢字的字形碼,確定漢字的點陣,并且在計算機和其他系統或設備需要信息、數據交換時還必須采用交換碼。
(1)漢字外部碼
漢字外部碼又稱輸入碼,由鍵盤輸入漢字時主要是輸入漢字的外碼,每個漢字對應一個外部碼。漢字輸入方法不同,同一漢字的外碼可能不同,用戶可以根據自己的需要選擇不同的輸入方法。目前,使用最為普遍的漢字輸入方法是拼音碼、五筆字型碼和自然碼。
(2)漢字交換碼(國標碼)
漢字信息在傳遞、交換中必須規定統一的編碼才不會造成混亂。目前國內計算機普遍采用的標準漢字交換碼是1980年我國根據有關國際標準規定的《信息交換用漢字編碼字符集——基本集》,即GB2312—1980,簡稱國標碼。
國標碼基本集中收錄了漢字和圖像符號共7 445個,分為兩級漢字。其中一級漢字3755個,屬于常用漢字,按照漢字拼音字母順序排序;二級漢字3 008個,屬于非常用漢字,按照部首順序排序;還收錄了682個圖形符號。
國標碼采用兩個字節表示一個漢字,每個字節只使用了低七位,漢字與英文完全兼容。但當英文字符與漢字字符混合存儲時,容易發生沖突,所以人們把國標碼的兩個字節高位置1,作為漢字的內碼使用。
(3)漢字機內碼
機內碼是計算機內部存儲和加工漢字時所用的代碼。計算機處理漢字,實際上是處理漢字機內碼。不管用何種漢字輸入碼將漢字輸入計算機,為了存儲和處理方便,都需要將各種輸入碼轉換成長度一致的漢字內部碼。一般用二個字節表示一個漢字的內碼。
(4)漢字字形碼
漢字字形碼是一種漢字的輸出碼,其作用為漢字輸出。但漢字機內碼不能直接作為每個漢字輸出的字形信息,還需根據漢字內碼在字形庫中檢索出相應漢字的字形信息后才能由輸出設備輸出。對漢字字形經過數字化處理后的一串二進制數稱為漢字輸出碼。
漢字的字形稱為字模,以一點陣表示。點陣中的點對應存儲器中的一位,16×16 點陣的漢字,有256個點,即256位。由于計算機中,8個二進制位作為一個字節,所以16×16點陣漢字需要2×16 = 32字節表示一個漢字的點陣數字信息(字模)。同樣,24×24點陣漢字需要3×24 = 72個字節來表示一個漢字;32×32 點陣漢字需要4×32 = 128個字節表示。點陣數越大,分辨率越高,字形越美觀,但占用的存儲空間越多。
漢字字庫:漢字字形數字化后,以二進制文件形式存儲在存儲器中,構成漢字字模庫。漢字字模庫也稱漢字字形庫,簡稱漢字字庫。