- 醫學計算機應用基礎(第二版)
- 楊長興 李連捷
- 4960字
- 2019-11-04 11:11:08
1.3 計算機內信息的表示與編碼
二進制數是計算機表示信息的基礎。本節首先引入二進制數的概念,然后介紹數值型數據在計算機內的表示方法和字符(包括英文字符和漢字)在計算機內的表示方法。
1.3.1 二進制
人類習慣使用十進制表示數。十進制有10個不同的數字(表記符號),它們是:0、1、2、3、4、5、6、7、8、9。十進制數進行運算時遵循“逢十進一”的規則。在進位計數制中所用的不同數字的個數稱為該進位計數制的基數,因此十進制的基數是10。
在人類社會發展過程中,人類還創造了各種不同的進位計數制。例如,一天24小時,即24進制,逢24進1;一小時60分,即60進制,逢60進1;一周7天,即7進制,逢7進1。在上述進位計數制中,有的有自己的標記符號,有的借用其他進位計數制的標記符號。用什么標記符號并不重要,只要使用方便即可。不同進位計數制之間的區別在于它們的基數和標記符號不同,進位規則不同。
1.二進制數
二進制數只有0和1兩個記數符,其進位的基數是2,遵循“逢二進一”的進位規則。在計算機中采用二進制數表示數據。原因在于:
(1)計算機科學理論已經證明:計算機中使用e進制(e≈2.718)最合理,取整數,可以使用三進制或二進制。
(2)由于二進制容易實現,在計算機內可用電壓的高和低來表達1和0兩個數字,如果使用三進制則需要3個電壓量來表達其3個標記符號,顯然,其可靠性比使用二進制更容易受電壓波動的影響。
(3)運算簡單:0+0=0,0+1=1,1+0=1,1+1=10;數值量與邏輯量共存,便于用邏輯運算器件實現算術運算。
二進制的基數為2,標記符號只有兩個:0和1,運算遵循“逢二進一”的規則。如:

2.八進制與十六進制數
人類使用二進制表達一個比較大的數值時,書寫較長,看起來不直觀,很容易出錯。由于八進制和十六進與二進制有運算上的完全對應關系,所以常常采用八進制和十六進制記數法(便于人們閱讀)。
八進制的基數為8,共有8個標記符號:0、1、2、3、4、5、6、7,運算遵循“逢八進一”的規則。1位八進制數正好用3位二進制數表達,它們的對應關系是:

八進制數與二進制數的轉換很容易,按照上表,每1位八進制數寫成對應的3位二進制數即完成八進制數到二進制數的轉換;從低位到高位每3位二進制數寫成對應的1位八進制數即完成二進制數到八進制數的轉換。如(157)8=(001101111)2。
十六進制的基數為16,共有16個標記符號:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,運算遵循“逢十六進一”的規則。1位十六進制數正好用4位二進制數表達,它們的對應關系是:

十六進制數與二進制數的轉換同樣很容易,按照上表,每1位十六進制數寫成對應的4位二進制數即完成十六進制數到二進制數的轉換;從低位到高位每4位二進制數寫成對應的1位十六進制數即完成二進制數到十六進制數的轉換。如(FD57)16=(1111110101010111)2。
3.二進制數與十進制數的轉換
十進制畢竟是人們最熟悉的數制。在計算機的輸入/輸出中通常采用十進制,即人們使用十進制數輸入數據、計算機使用十進制數輸出數據,機內數據存儲使用二進制。數據的輸入/輸出過程中的十進制數到二進制數、二進制數到十進制數的轉換由機器自動完成。
(1)二進制數→十進制數。一個二進制數按其權位(權位用十進制表示)展開求和,即可得相應的十進制數。如:
(110.101)2=(1×22+1×21+0×20+1×2-1+0×2-2+1×2-3)10
=(4+2+0.5+0.125)10=(6.625)10
(2)十進制數→二進制數。整數部分的轉換采用“除2取余”法。十進制數整數部分除以2,余數作為相應二進制數整數部分的最低位;用所得的商再除以2,余數作為二進制數的次低位……一直除到商為0,最后一步的余數作為二進制數的最高位。
例如:將十進制數11轉換為二進制數的過程如下:
除法 商 余數
11÷2 5 1
5÷2 2 1
2÷2 1 0
1÷2 0 1
故(11)10=(1011)2。
小數部分的轉換采用“乘2取整”法:十進制小數部分乘2,積的整數部分為相應二進制數小數部分的最高位;用所得積的小數部分再乘2,同樣取積的整數部分作為相應二進制數小數部分的次高位……一直乘到積的小數部分為0或達到所要求的精度為止。
例如:將十進制數0.625轉換為二進制數的過程如下:
乘法 積的整數部分 積的小數部分
0.625×2 1 0.25
0.25×2 0 0.5
0.5×2 1 0
故(0.625)10=(0.101)2。
1.3.2 數在計算機內的表示方法
1.信息度量單位
無論是數值型數據,還是字符(包括英文字符、漢字或其他符號)都是存儲在一個稱為字節的單元中。一個二進制位稱為位(bit),8個二進制位組成一個字節(Byte),更大的度量單位是KB、MB、GB、TB。1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB。計算機信息處理的最小單位是位,而計算機尋址的單位是字節。
2.原碼
我們知道:數據在計算機內使用二進制形式表示。二進制數在計算機內究竟如何存儲呢?可以使用原碼(True form)、反碼(One’s complement)和補碼(Two’s complement)。
以下討論假設使用8位二進制表示。用其中一位表示數的符號,用0表示正數,用1表示負數。數值部分用其余7位以二進制形式表示。我們看看下面兩個數的8位原碼表示。

在原碼表示法中,數值0有兩種表示方法,即正0和負0。簡記為[+0]=00000000,
[-0]=10000000。
3.反碼
反碼又譯作“對1的補碼”。符號位與原碼約定相同;正數的反碼與原碼相同,負數的反碼是在原碼的基礎上按位取反。如[+27]反=[+27]原=00011011,而[-37]反=11011010。
在反碼表示法中,數值0也有兩種表示方法,即正0和負0。簡記為[+0]=00000000,[-0]=11111111。
反碼表示法的優點是統一了加減法運算,只需要計算加法。反碼表示法的缺點是運算時會引起循環進位,這既占用機器計算時間,又給機器設計帶來麻煩。因此,人們又尋求另一種表示方法:補碼。
4.補碼
補碼又譯作“對2的補碼”。符號位與原碼約定相同;正數的補碼與原碼相同,負數的補碼是在原碼的基礎上按位取反后,最后位加1。如[+27]補=[+27]原=00011011,而[-37]補=11011011。
在補碼表示法中,0有唯一的表示方法:[+0]補=[-0]補=00000000。
引入補碼概念后,加法、減法都可用加法實現。因此,現代計算機多采用補碼運算。
在討論原碼時我們已經假設使用8位二進制表示數,即假設計算機的字長是8位。因為要用一位表示符號,所以只有7位用來表示數據,那么在這臺計算機上數據的表示范圍是:-128~+127。當實際數據不在這個范圍內就會出錯,這就是溢出。當然現代的計算機的字長大于8位(16、32或64位),但終究有一個范圍。對于溢出問題,計算機要作相應處理。
前面討論的3種表示方法只能表示單純整數或小數,我們認為是數的定點表示法。在計算機中,參與運算的數一般是實數,既有整數部分又有小數部分,為了表示實數,使用數的浮點表示方法。任何一個實數可以表示成A=2i×S,其中S是實數A的尾數,S的符號可用CS表示,0表示正數,1表示負數;i是用二進制表示的階碼,i的符號可用Ci表示,0表示正數,1表示負數。例如,實數110.101可表示成:211×0.110101。浮點的表示方法格式如下:

Ci、CS各只用一位,i的位數決定實數的表示范圍,S的位數決定實數的精度。
計算機內的數值運算以加法為基礎,其他運算都可以變成加法實現。然而現代的微處理器內已集成了浮點運算部件,其中包括了乘法器等,以提高運算速度。
1.3.3 編碼(字符在計算機內的表示方法)
字符在計算機內是用二進制形式表示的,其中包括字符與漢字。
1.ASCII編碼
當今的計算機普遍采用ASCII編碼,即美國標準信息交換碼(American Standard Code for Information Interchange)。ASCII碼中的字符用8位二進制數表示,但只用低7位,共表示128個字符,編碼從0至127(稱為ASCII碼基本集),128至255的編碼(稱為ASCII碼擴展集)作它用。如字符“A”的編碼表示如下:

ASCII字符編碼如表1-1所示。編碼從0至31表示控制字符,控制字符對照表如表1-2所示。
表1-1 ASCII字符編碼表

表1-2 控制字符及其作用對照表

2.漢字編碼
漢字編碼包括漢字內碼、漢字輸入編碼(外碼)和漢字輸出編碼(字模)3個主要內容。
(1)漢字內碼。漢字內碼是漢字在計算機內的存儲表示。漢字數量龐大,只能選取部分漢字用于計算機漢字信息處理。國家標準GB 2312—1980定義了國標碼(區位碼),它包括7445個漢字和符號,分為94個區,區號為1至94,每區容納94個漢字或符號(漢字在區內的排列位置稱為位),位號為1至94,可對應94個漢字或94個符號。其中682個符號在第1區至第9區;第10區至第15區未用;6763個漢字分為兩級,一級字庫從第16區至第55區,包括3755個常用漢字,按音序排列;二級字庫從第56區至第87區,包括3008個次常用漢字,按筆畫數排列。請讀者注意,國標碼是4位十六進制數,按上面的定義,“啊”字在第16區第01位上,十進制數“1601”并不是“啊”字的國標碼(實際上是其區位碼,區位碼是一種漢字輸入方法,討論輸入編碼時將介紹),國標碼是將某字的區位碼之區、位分別轉換成十六進制數,分別加上十六進制數“20”。故“啊”字的國標碼為“3021”。每一個漢字或符號在區位碼代碼集或國標碼代碼集中都有唯一的代碼。
漢字內碼可使用ASCII碼擴展集的代碼(128~255),但因漢字數量眾多,用一字節無法表示,所以用兩個連續的字節來存放一個漢字的內碼。漢字字符(用漢字內碼表示)必須與英文字符(用ASCII碼表示)能相互區別,以免造成混淆,這也就是所謂的中西文兼容問題。英文字符的機內代碼是7位ASCII碼,最高位為“0”(即b7=0),漢字內碼中兩個字節的最高位均為“1”。將某漢字的國標碼分別加上80H,作為漢字內碼。以漢字“啊”為例,國標碼為3021H,漢字內碼為B0A1H。
由于國家標準GB 2312—1980漢字集收錄的漢字有限,不能完全滿足現在的應用需要,現在又推出了國家標準GB 18030—2005。GB 18030—2005標準收錄了總計23940碼位,共收入21886個漢字和圖形符號,其中漢字(包括部首和構件)21003個,圖形符號883個。包括GB 2312—1980集中的6763個漢字,GB2312—1980集中的漢字編碼不變。增加的漢字一部分采用2字節編碼,一部分采用4字節編碼。
(2)漢字輸入編碼(外碼)。漢字的輸入不能像英文字符那樣,一鍵對應一個字符,只能多鍵輸入一個漢字,這里的多鍵就是一個漢字的輸入編碼。可見,漢字輸入編碼是將漢字輸入到計算機內(變成漢字內碼)的編碼,所以有人稱之為外碼。目前有幾百種漢字輸入編碼。我們列舉具有代表性的幾種輸入編碼。
①區位碼:一個漢字的區位碼是一個4位十進制數。如漢字“啊”的區位碼為1601。用區位碼輸入漢字實際上是將區位碼轉換成漢字內碼。這是一種無重碼(重碼是一個輸入編碼對應多個漢字)輸入方法,即一個輸入編碼對應一個漢字(內碼)。
②拼音輸入編碼:用漢字的拼音符號作為輸入編碼。如漢字“湖”的拼音是“hu”,這就是其拼音輸入編碼。用拼音輸入方法輸入漢字就是把像“hu”這樣的輸入編碼變成所表達的漢字的內碼。顯然,拼音輸入方法是一種有重碼的輸入方法。
③字形輸入編碼:是一種以漢字的偏旁部首作基本鍵位的輸入編碼,即把鍵盤上的某一鍵位當作偏旁部首(當然,某一鍵位可能代表多個偏旁部首),多個鍵位(對應多個偏旁部首)的組合就是漢字的字形輸入編碼。五筆字型輸入編碼屬于這一類輸入編碼,它是目前用得相當廣泛的輸入編碼。例如,在五筆字型輸入方案中,“湖”字的3個偏旁部首“氵”“、“古”“、“月”分別安排在鍵盤的“i”“d”“e”3個鍵位上,那么“ide”字串就是“湖”字的五筆字型輸入編碼。
一般來說,字形輸入編碼輸入方法的重碼少于拼音輸入方法,輸入速度快;而拼音輸入方法易學,輸入速度慢。
(3)漢字輸出編碼。把某一個漢字當作一幅平面圖畫。分別從縱、橫兩個方向等距離在畫上畫(N-1)條直線,這樣就把該幅畫分成N×N小方塊,我們會發現有的小方塊內有漢字的筆畫,有的則沒有。把有筆畫的小方塊記上“1”,沒有筆畫的小方塊記上“0”,就得到了一幅由“1”組成的該漢字的輪廓畫,這就是一幅數值化了的圖形。圖1-1給出了一個16×16點陣“大”字的數值化圖形。當然此圖中的漢字比較粗糙。按照此構思可以為每個漢字構造這樣的圖形。對于任何一個漢字,可以把其數值化了的平面的“0”“1”圖形按先行后列(也可先列后行)的順序編成二進制代碼串存入計算機中(每一個“0”或“1”用一個二進制位存儲)。我們把這樣數值化的圖形叫做某漢字的N×N點陣字模。對于一個16×16點陣的漢字字模,需要16×16個二進制位來存儲其字模,即需要32字節。圖1-1中的“大”的32字節數據(按先行后列順序,16進制)是:00、00、03、80、03、04、7F、FE、7F、FE、27、00、06、80、0C、40、0C、60、18、30、18、30、30、18、30、18、20、0C、40、0E、00、00。

圖1-1 16×16點陣模型
所有漢字的字模集合稱為字庫。對于用16×16點陣字模組成的字庫需要大約220KB存儲容量。漢字字模在字庫中的位置按漢字內碼升序存入字庫中。