- 大學計算機基礎(第三版)
- 萬珊珊 呂橙
- 4942字
- 2019-10-12 16:03:59
1.2.5 計算機中數據的表示
信息是以數據的形式存儲和處理的。數據的類型有很多,數字和文字是最簡單的數據類型,表格、聲音、圖形和圖像則是復雜的類型。計算機不能直接處理這些數據類型,必須把這些數據以規定的二進制形式表示才能被計算機加以處理,這些規定的形式就是數據的編碼。編碼時需要考慮數據的特性和是否便于計算機存儲和處理。下面介紹幾種常用的數據編碼。
計算機的數據包括數值型和非數值型兩大類。數值型數據可以進行算術運算,非數值型數據不能進行算術運算。
1.數值
(1)數的符號
由于數據有正有負,在計算機中用“0”表示“+”,用“1”表示“?”。一般把用正負符號數字化表示的數稱為機器數,把正負符號用“+”和“?”表示的數稱為真值。
(2)定點數和浮點數
在數學上,小數點一般用“.”來表示。在計算機中,小數點的表示采用人工約定的方法來實現,即約定小數點的位置,這樣可以節省存儲空間。
①數的定點表示:在定點數的表示方法中,小數點的位置是一個約定的假想位置。一般有兩種定點方式:一是固定在符號位的后面(左面),通常用來表示一個規范化的小數,稱為定點小數;二是將小數點固定在最低數值位的后面(右面),用來表示一個整數,稱為定點整數。
定點整數分為帶符號的整數和不帶符號的整數兩類。帶符的整數的最高位表示符號,其他位是數值位。不帶符號的整數全部都是數值位,不能表示負數。
表1-6中給出了8位、16位、32位字長的計算機所能表示的數的范圍。
表1-6 位數不同的數的表示范圍

提示
字長為n的有符號數可以表示的絕對值最大的負數為?2n,此時,數的最高位為1,它既表示符號位,也表示數值位。
例如,十進制數?100用一個字節存儲形式如下:

其中,左側的最高位“1”為數符,即符號位。
②數的浮點表示:用定點法所能表示的數值范圍非常有限,在做定點運算時,計算結果很容易超出字的表示范圍,所以當數據很大或很小時,通常用浮點數來表示。浮點表示法與科學計數法類似,十進制的指數表示一般形式是p=m×10n,p為十進制數值,m為尾數,n為指數,10為基數。
為了便于計算機中小數點的表示,規定將浮點數寫成規格化的形式,即尾數絕對值的范圍在[0.1,1)之間,這樣便準確規定了小數點的位置,例如,0.000215的科學計數法的規格化形式為0.215×10-3。
類似地,計算機中二進制數的浮點表示法主要包括兩部分:一部分是尾數,為定點小數;另一部分是階碼,為定點整數,基數約定為2。階碼部分又包括階符和階碼,尾數部分包括數符和尾數。其中,數符和階符各占1位,階碼的位數對應數的大小范圍,尾數的位數對應數的精度,存儲形式如下:

假定1個浮點數用2個字節來表示,設階碼部分占4位,尾數部分占10位。十進制數?6.75在計算機內的表示形式作如下轉換:

在計算機內的表示形式如下:

浮點數的運算精度和表示范圍都遠遠大于定點數,但在運算規則上,定點數比浮點數簡單,容易實現。因此,計算機中一般都同時具有這兩種表示方法。
(3)原碼、反碼和補碼
一個二進制數同時包含符號和數值兩部分,將符號也數值化的數據稱為機器數。在計算機中機器數的表示方法很多,常用的有原碼、反碼和補碼3種形式。原碼表示法簡單易懂,但由于原碼表示的數在運算時常要進行一些判斷,從而增加了運算的復雜性,故引入反碼和補碼。
①原碼表示法:原碼表示法是一種簡單的機器數表示法,即用最高位表示符號,其余位表示數值。設x為真值,[x]原為數的原碼。
②反碼表示法:正數的反碼與原碼相同;負數的反碼只須在原碼的基礎上把符號位以外各位按位“求反”(0變1,1變0)即可,[x]反表示數的反碼。
③補碼表示法:正數的補碼與原碼相同;負數的補碼是在原碼的基礎上符號位不變,數值各位取反(0變1,1變0),然后最低位加1,[x]補表示數的反碼。
從上面關于原碼、反碼、補碼的定義可知:一個正數的原碼、反碼、補碼的表示形式相同,符號位為0,數值位是真值本身;一個負數的原碼、反碼、補碼的符號位都為1,數值位原碼是真值本身,反碼是各位取反,補碼是各位取反后,最低位再加1。真值0的原碼和反碼表示不唯一,而補碼表示是唯一的。
【例1-7】已知x1=+1100110,x2=?1100111,求x1和x2的原碼、反碼和補碼。
解:根據原碼和反碼、補碼的轉換規則,可知正數的原碼和反碼、補碼一致。即
[x1]原=[x1]反=[x1]補=01100110
根據負數的轉換規則,[x2]原=11100111,[x2]反=10011000,[x2]補=10011001。
2.十進制數的編碼——BCD碼
人們習慣用十進制來計數,而計算機中采用的是二進制數。通常,計算機中用4位二進制數來表示一位十進制數,稱為BCD碼。常見的BCD碼有8421 BCD碼2421 BCD碼。在8421 BCD碼中,每4位二進制數為一組,組內每個位置上的位權從左至右分別為8、4、2、1。以十進制數0~15為例,它們的8421 BCD編碼對應關系如表1-7所示。
表1-7 十進制數與BCD碼的關系

提示
一個十進制數的BCD碼與它對應的二進制數是有區別的。例如,十進制數16的BCD碼是00010110,但它對應的二進制數是10000。
3.字符的編碼
在使用計算機進行信息處理時,字符型數據是非常普遍的。字符型數據包括各種字母、數字與符號等,它們在計算機中用二進制進行統一編碼。ASCII碼(American Standard Code for Information Interchange)即美國標準信息交換碼,被國際標準化組織(ISO)定為國際標準。
ASCII碼有7位ASCII碼和8位ASCII碼兩種。
7位ASCII碼稱為基本ASCII碼,是國際通用的ASCII碼。用1個字節表示7位ASCII碼時,最高位為0,故7位二進制數可表示128個字符,它的范圍為00000000B~01111111B。其中,包括52個英文字母(大、小寫各26個)、0~9這10個數字及一些常用符號,如表1-8所示。
表1-8 ASCII碼表

8位ASCII碼稱為擴充ASCII碼,是8位二進制字符編碼,其最高位有些為0,有些為1,其范圍為00000000B~11111111B,因此可以表示256種不同的字符。其中,00000000B~01111111B為基本部分,對應十進制數的范圍為0~127,共計128種;10000000B~11111111B為擴充部分,范圍為128~255,也有128種。盡管對擴充部分的ASCII碼美國國家標準信息學會已給出定義,但在實際應用中多數國家都將ASCII碼擴充部分規定為自己國家語言的字符代碼,如中國把擴充ASCII碼作為漢字的機內碼。
關于ASCII碼有以下幾點說明:
①通常一個ASCII字符占用1個字節(8bit),最高位為“0”,需要時最高位可用作奇偶檢驗位。
②標準的7位ASCII碼字符分為兩類:一類是可顯示的打印字符,共有95個;另一類是不可顯示的控制符,通常是計算機系統專用的,共有33個(前32個碼和最后一個碼)。
③ASCII碼字符根據它們在表中的位置都有一個序號,數字字符0~9的ASCII碼是連續的,為30H~39H;ASCII碼字符是區分大小寫的,大寫字母A~Z和小寫英文字母a~z的ASCII碼也是連續的,分別為41H~5AH和61H~7AH。例如:大寫字母A,其ASCII碼為1000001B,即ASC(A)=65;小寫字母a,其ASCII碼為1100001B,即ASC(a)=97。可推得ASC(C)=67,ASC(c)=99。
4.漢字的編碼
英文字母數量少,在計算機的鍵盤上都有對應的輸入按鍵。計算機內部存儲和處理英文字母一般采用ASCII碼就可以完成。漢字數量龐大,而且漢字字形、字體復雜多變,使用計算機對漢字進行處理就要復雜得多。漢字的輸入要采用輸入碼;在計算機中存放和處理要使用機內碼;輸出時需要用對應的字形碼進行顯示和打印。即在漢字處理中需要經過漢字輸入碼、漢字機內碼、漢字字形碼的三碼轉換,下面分別介紹與漢字相關的碼型。
(1)漢字輸入碼
漢字的非鍵盤輸入已取得了一定的發展,如語音識別輸入、手寫輸入和掃描輸入等。
漢字是一種拼音、象形和會意文字,本身具有十分豐富的音、形、義等內涵。經過專家多年的潛心研究,形成了種類繁多的漢字輸入碼。迄今為止,已有好幾百種漢字輸入碼的編碼方案問世,其中已經得到廣泛使用的也達幾十種之多。按照漢字輸入的編碼元素取材的不同,可將眾多的漢字輸入碼分為如下4類:
①區位輸入法:區位輸入法是利用區位碼進行漢字輸入的一種方法,又稱內碼輸入法。漢字區位編碼由4位組成,前2位是區號,后2位是位號。區位碼漢字輸入法中的漢字編碼無重碼,向內部碼轉換方便。在熟練掌握漢字的區位碼后,錄入漢字的速度會很快,但若想記住全部區位碼相當困難,所以區位碼常用于錄入特殊符號,如制表符、希臘字母等,或者輸入發音、字形不規則的漢字、生僻字。
②音碼:音碼是根據漢字的發音來確定漢字的編碼,其特點是簡單易學,但重碼太多,輸入速度較慢。常用的音碼輸入法有全拼、智能ABC、雙拼。
③形碼:形碼是根據漢字的字形結構來確定漢字的編碼,其特點是重碼較少,輸入速度較快,但熟練掌握較困難,記憶量較大。目前,最為流行的形碼輸入法——五筆字型輸入法是我國的王永明教授在1983年開發的,五筆字型輸入法在世界上首破漢字輸入每分鐘100字大關,已成為在國內外占主導地位的漢字輸入技術,這一重大技術發明為我國的科技進步和漢字在信息化、國際化時代的發展做出了重大貢獻。
④音形碼:音形碼是既根據漢字的發音也根據漢字的形狀來確定漢字編碼的一種方法,其特點是編碼規則簡單,重碼少,缺點是難記憶,例如自然碼。
(2)國標碼
我國的《信息交換用漢字編碼字符集 基本集》GB 2312—1980中規定了信息交換所用的6763個漢字和682個非漢字圖形符號的代碼,即共有7445個代碼。如此龐大的漢字集需要多少位二進制數才能夠表示呢?由于漢字要區別于西文符號的表示,所以每個字節表示中最高位必須為1,故只能用低7位表示漢字集,即只能表示27=128個漢字。又由于低7位中有34種編碼是用于控制字符,因此只有94(128?34=94)種狀態可用于漢字編碼。這樣,雙字節的低7位只能表示94×94=8836種狀態。此標準的漢字編碼表有94行、94列。其行號稱為區號,列號稱為位號。雙字節中,用高字節表示區號,低字節表示位號。非漢字圖形符號位于第1~11區,國標漢字集中的6763個漢字又按其使用頻度、組詞能力以及用途等因素分成一級常用漢字3755個,按音序排列;二級常用漢字3008個,按部首排列。一級漢字3755個置于第16~55區,二級漢字3008個置于第56~87區。例如,“大”字位于20區83位,其區位碼如下:

國家標準GB 2312—1980中的漢字代碼除了十進制形式的區位碼外,還有一種十六進制形式的編碼,稱為國標碼。國標碼是在不同漢字信息系統間進行漢字交換時所使用的編碼。為了與ASCII碼兼容,每個字節值應大于32,因為0~32為非圖形字符碼值。所以,國標碼是在十進制區位碼的基礎上,其區碼和位碼分別加十進制數32。例如,“大”字的國標碼如下:

(3)漢字機內碼
漢字的機內碼是供計算機系統內部進行存儲、加工處理、傳輸統一使用的代碼,又稱為漢字內部碼或漢字內碼。西文的機內碼就是它的ASCII碼,字符的ASCII碼最高位為“0”,因此為了與西文字符區別,所有漢字的機內碼在國標碼的基礎上,把兩個字節的最高位一律由“0”改為“1”,就得到了漢字的機內碼,如“大”字的機內碼如下:

在Office辦公軟件中選擇“插入”|“符號”命令,打開“符號”對話框,找到“大”字,可以看到“大”字的機內碼對應的十六進制為B4F3H,如圖1-13所示。

圖1-13 “大”字的機內碼輸入
機內碼表示簡單,解決了中西文機內碼存在二義性的問題。內碼的形式也有多種,除GB 內碼外,還有如GB K、UCS、BIG5、Unicode等。其中,Unicode碼又稱萬國碼或統一碼,也是一個國際編碼標準,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。Unicode碼在當前的網絡、Windows系統和許多大型軟件中得到了廣泛的應用。
(4)漢字的字形碼
漢字字形碼是漢字字庫中存儲的漢字字形的數字化信息,用于漢字的顯示和打印。常用的輸出設備是顯示器與打印機。漢字字形碼通常用點陣、矢量函數等方式表示。常用的字形點陣有16×16點陣、24×24點陣、48×48點陣、96×96點陣、128×128點陣、256×256點陣。不同的字體有不同的字庫,如黑體、仿宋體、楷體等。點陣的點數越多,一個字的表達質量也越高,也就越美觀,但占用的存儲空間也就越大。以“大”的16×16點陣為例[見圖1-14(a)],每行需用2個字節,共16行,則占用32個字節。因此,字模點陣只能用來構成“字庫”,而不能用于機內存儲。字庫中存儲了每個漢字的點陣代碼,當顯示輸出時才檢索字庫,輸出字模點陣得到字形。
提示
漢字“大”的16×16點陣的第一行在計算機中的十六進制代碼存儲內容的計算方法是:將第一行的兩個字節中黑點處的D9和D8位置為1,其他位置為0,可得0000 0011 0000 0000B,即為0300H。其余各行的存儲代碼可同樣推理。
(5)漢字處理流程
通過輸入設備將漢字外碼送入計算機,再由漢字系統將其轉換成內碼存儲、傳送和處理,當需要輸出時,再由漢字系統調用字庫中漢字的字形碼得到結果,整個過程如圖1-14(b)所示。

圖1-14 “大”字點陣和漢字處理流程
- Learning Java Functional Programming
- DBA攻堅指南:左手Oracle,右手MySQL
- 機器學習系統:設計和實現
- Game Programming Using Qt Beginner's Guide
- Scratch真好玩:教小孩學編程
- C程序設計案例教程
- Web Development with MongoDB and Node(Third Edition)
- R語言數據挖掘:實用項目解析
- Secret Recipes of the Python Ninja
- Hands-On Dependency Injection in Go
- 數據結構:Python語言描述
- Mastering Unreal Engine 4.X
- Building a Media Center with Raspberry Pi
- HTML5程序設計基礎教程
- Processing開發實戰