- 大學(xué)計(jì)算機(jī)基礎(chǔ)教程
- 賴慶 劉松
- 4613字
- 2019-10-14 11:38:02
1.2.4 信息的存儲(chǔ)與編碼
1.信息的存儲(chǔ)
在計(jì)算機(jī)內(nèi)部,各類信息均加以二進(jìn)制編碼,然后進(jìn)行進(jìn)一步的存儲(chǔ)、處理。信息量的大小通過(guò)以下所介紹的信息單位加以表示。
(1)位(bit)
位是計(jì)算機(jī)中最小的數(shù)據(jù)單位,如二進(jìn)制數(shù)0101100為7位,用bit表示位。
(2)字節(jié)(byte)、千字節(jié)(KB)、兆字節(jié)(MB)、吉字節(jié)(GB)、太字節(jié)(TB)
八位二進(jìn)制數(shù)稱為一個(gè)字節(jié),即1byte=8bit,通常用B表示字節(jié)。字節(jié)是信息存儲(chǔ)中的最基本單位。由于字節(jié)單位還太小,因此又定義了千字節(jié)、兆字節(jié)、吉字節(jié)和太字節(jié)幾個(gè)常用單位,它們之間的數(shù)量關(guān)系如下:
1KB=1024B 1MB=1024KB
1GB=1024MB 1TB=1024GB
(3)字(word)與字長(zhǎng)(word length)
字又稱計(jì)算機(jī)字。字是計(jì)算機(jī)作為一個(gè)整體來(lái)處理數(shù)據(jù)的一組二進(jìn)制數(shù),通常一個(gè)字包含一個(gè)或多個(gè)字節(jié)。字長(zhǎng)是一個(gè)字所包含的二進(jìn)制數(shù)的位數(shù)。平時(shí)我們所說(shuō)的8位機(jī)、16位機(jī)、32位機(jī)、64位機(jī),就是指字長(zhǎng)分別是8位、16位、32位、64位的計(jì)算機(jī)。一般來(lái)說(shuō),字長(zhǎng)越長(zhǎng),計(jì)算機(jī)處理數(shù)據(jù)的能力也越強(qiáng)、其性能也越好。計(jì)算機(jī)的字長(zhǎng)取決于數(shù)據(jù)總線的寬度,數(shù)據(jù)總線一般由8、16、32或64根導(dǎo)線和電路組成。
2.信息的編碼
(1)數(shù)值數(shù)據(jù)的編碼
計(jì)算機(jī)能夠完成哪些運(yùn)算呢?計(jì)算機(jī)能夠完成以下運(yùn)算:
①算術(shù)運(yùn)算:加(+)、減(-)、乘(*)、除(/)。乘方、開平方根、絕對(duì)值等運(yùn)算都是在基于以上基礎(chǔ)。
②關(guān)系運(yùn)算:大于(>)、等于(=)、小于(<)、大于等于(>=)、小于等于(<=)、不等于(≠)等關(guān)系運(yùn)算。
③邏輯運(yùn)算:與(and)、或(or)、非(not)運(yùn)算。
從設(shè)計(jì)的角度考慮,計(jì)算機(jī)對(duì)于每種運(yùn)算都設(shè)計(jì)對(duì)應(yīng)的器件,那么CPU就太復(fù)雜了,成本也將大大地提高。在實(shí)際設(shè)計(jì)中,CPU內(nèi)部用于運(yùn)算的核心部件其實(shí)只有一個(gè)加法器,只能做加法。減法、乘法、除法都是通過(guò)加法來(lái)實(shí)現(xiàn)的。
現(xiàn)介紹幾個(gè)基本概念:
●真值:一個(gè)以二進(jìn)制形式表示的真實(shí)值,是一個(gè)理想概念下的數(shù)值,在計(jì)算機(jī)中一般無(wú)法得到。
●機(jī)器數(shù):一個(gè)數(shù)值數(shù)據(jù)以二進(jìn)制形式保存在計(jì)算機(jī)內(nèi),稱為機(jī)器數(shù)。機(jī)器數(shù)有兩個(gè)特點(diǎn):一是符號(hào)數(shù)字化,通常最高一位是符號(hào)位,“0”表示正數(shù),“1”表示負(fù)數(shù),如八位二進(jìn)制機(jī)器數(shù)00000001表示+1,而二進(jìn)制機(jī)器數(shù)10000001表示-1;二是其數(shù)的大小受機(jī)器字長(zhǎng)的限制。機(jī)器數(shù)有固定的位數(shù),具體和機(jī)器有關(guān)。如現(xiàn)在使用的計(jì)算機(jī)都是64位計(jì)算機(jī),那么這個(gè)機(jī)器數(shù)通常是64位。機(jī)器數(shù)分為原碼、反碼、補(bǔ)碼三種表示形式。
●原碼:符號(hào)位用“0”和“1”表示正、負(fù),數(shù)值部分就是該數(shù)的二進(jìn)制絕對(duì)值。
●反碼:將原碼中的除符號(hào)位的所有位取反,就是反碼,但是計(jì)算機(jī)中正數(shù)的反碼和原碼相同,只有負(fù)數(shù)才將數(shù)值位取反。例如,原碼+3的二進(jìn)制數(shù)(00000011)B對(duì)應(yīng)的反碼還是(00000011)B,而原碼是-3的二進(jìn)制數(shù)(10000011)B對(duì)應(yīng)的反碼是(11111100)B。
●補(bǔ)碼:在補(bǔ)碼表示中,正數(shù)的補(bǔ)碼表示和原碼相同,負(fù)數(shù)的補(bǔ)碼是在反碼的最低有效位上加1,用[x]補(bǔ)表示。
補(bǔ)碼在計(jì)算機(jī)中具有重要的意義,正因?yàn)橛醒a(bǔ)碼,計(jì)算機(jī)可以將減法運(yùn)算用加法運(yùn)來(lái)代替,使得CPU只要有加法器就可以進(jìn)行算術(shù)運(yùn)算。補(bǔ)碼到底有什么意義呢?實(shí)際補(bǔ)碼的計(jì)算和位數(shù)有關(guān),或者說(shuō)和表示數(shù)據(jù)的權(quán)值有關(guān)。
例如,6的十進(jìn)制的權(quán)是10,所以6的補(bǔ)碼是10-6=4,也就是說(shuō)4是6的補(bǔ)碼,也可以說(shuō)6是4的補(bǔ)碼,現(xiàn)在用加法來(lái)完成減法運(yùn)算,如8-6=2,將所有的數(shù)都用補(bǔ)碼表示,步驟如下:
8是正數(shù),所以補(bǔ)碼是8,
-6的補(bǔ)碼是4,
計(jì)算8-6=8+[6]補(bǔ)=8+4=12
因?yàn)槲覀兊臋?quán)值是10,所以高位1去掉,最后的答案是2。
我們?cè)倏匆粋€(gè)2位數(shù)的十進(jìn)制運(yùn)算12-23=-11怎么用加法來(lái)計(jì)算呢?在這里的權(quán)值是100。
正數(shù)12的補(bǔ)碼是12。
[-23]的補(bǔ)碼是100-23=77。
計(jì)算:12-23=12+[23]補(bǔ)=12+77=89
因?yàn)檫@個(gè)答案是負(fù)數(shù)(注意:這里我們沒(méi)有對(duì)符號(hào)進(jìn)行運(yùn)算,權(quán)且認(rèn)為是負(fù)數(shù)),所以還要對(duì)89再取補(bǔ)碼,[89]補(bǔ)=100-89=11,所以最后的結(jié)果是-11。
再例如二進(jìn)制的補(bǔ)碼運(yùn)算,為了簡(jiǎn)單,選取二進(jìn)制的位數(shù)是4位,這樣便于計(jì)算權(quán)值。例如,要計(jì)算12-4,對(duì)應(yīng)的二進(jìn)制機(jī)器數(shù)原碼為:01100-00100,可以認(rèn)為是01100+10100;這里最高位是符號(hào)位,現(xiàn)在使用補(bǔ)碼進(jìn)行運(yùn)算,步驟如下:
[01100]補(bǔ)還是01100(正數(shù)的補(bǔ)碼和原碼是一樣的).
[10100]補(bǔ)怎么求呢?因?yàn)槭?位二進(jìn)制,所以權(quán)值是16,所以[-4]補(bǔ)=16-4=12,對(duì)應(yīng)的二進(jìn)制是1100,所以[-4]補(bǔ)對(duì)應(yīng)11100,最高位是符號(hào)位。注意補(bǔ)碼1100正好是0100取反加1的結(jié)果,所以二進(jìn)制的補(bǔ)碼計(jì)算可以使用取反加1的方法來(lái)計(jì)算,符號(hào)位不變。
計(jì)算:01100+11100

顯然,最后的符號(hào)位為0,被進(jìn)位修改了,這是一個(gè)正數(shù),答案正好是8,12-4=8。如果是8-12的4位二進(jìn)制,01000-00100=01000+10100的結(jié)果會(huì)如何呢?+8的二進(jìn)制補(bǔ)碼01000,-12的二進(jìn)制補(bǔ)碼10100。計(jì)算:8-12相當(dāng)于01000+10100

由于最高一位是1,所以最后的答案還要再取補(bǔ)碼得到原碼,11100的補(bǔ)碼是10100,正好是-4。
結(jié)論:由上面的例子可以看出,補(bǔ)碼的運(yùn)用大大簡(jiǎn)化了計(jì)算機(jī)運(yùn)算部件的設(shè)計(jì),在計(jì)算機(jī)中只要設(shè)計(jì)加法器,就可以做加減法運(yùn)算,而乘除法運(yùn)算可以用移位運(yùn)算和加法運(yùn)算實(shí)現(xiàn)??梢娪?jì)算思維的實(shí)際應(yīng)用價(jià)值巨大。
(2)字符型數(shù)據(jù)的編碼
在計(jì)算機(jī)中,對(duì)非數(shù)值的信息(如文字、聲音等)進(jìn)行處理時(shí),須對(duì)其先進(jìn)行數(shù)字化處理,也即用二進(jìn)制編碼來(lái)表示文字和符號(hào)等信息。對(duì)文字和符號(hào)進(jìn)行二進(jìn)制編碼稱為字符編碼。字符編碼涉及信息在計(jì)算機(jī)內(nèi)部的表示、交換、處理和存儲(chǔ)等問(wèn)題,一般都是以國(guó)家標(biāo)準(zhǔn)或國(guó)際標(biāo)準(zhǔn)加以實(shí)行的。
①ASCII碼。ASCII碼是“美國(guó)信息交換標(biāo)準(zhǔn)代碼”(American Standard Code for Information Interchange)的簡(jiǎn)稱目前國(guó)際上最為流行的英文字符信息編碼方案。ASCII碼包括0~9十個(gè)數(shù)字、大小英文字母及專用符號(hào)等95種可打印字符,另外還有33種控制字符(如回車符、換行符等),如表1-4所示。
表1-4 七位ASCII代碼表

ASCII碼有以下幾個(gè)編碼特點(diǎn):
●ASCII碼中的每個(gè)字符用7位二進(jìn)制表示,其排列次序?yàn)镈6D5D4D3D2D1D0;而在計(jì)算機(jī)內(nèi)部一個(gè)字符實(shí)際占用8位二進(jìn)制位,其最高位D7為“0”。在數(shù)據(jù)傳輸過(guò)程中需要奇偶校驗(yàn)時(shí),D7可用作校驗(yàn)位。例如,大寫英文字母Z的ASCII碼為1011010,而空格鍵SP的ASCII碼為0100000,轉(zhuǎn)換為十進(jìn)制的編碼值為32。
●ASCII碼是128個(gè)字符所組成的字符集。其中編碼值0~31(0000000~0011111)是不可印刷的符號(hào),通常稱為控制符,也即用于計(jì)算機(jī)通信中的通信控制或?qū)τ?jì)算機(jī)設(shè)備的功能控制。編碼值32是空格字符SP,編碼值為127(1111111)是刪除控制DEL碼,其余94個(gè)字符為可印刷字符。
●阿拉伯符號(hào)0~9的高3位編碼為011,低四位編碼為0000~1001,低四位的二進(jìn)制形式就是0~9的對(duì)應(yīng),這既有利于排序需要,又有利于在ASCII碼與二進(jìn)制碼之間的轉(zhuǎn)換。
●英文字母的ASCII碼值滿足正常的字母排序要求,大小寫字母的編碼差別僅在于D5位的值為0還是為1,這有利于大小寫字母之間的編碼轉(zhuǎn)換。
②EBCDIC碼。EBCDIC碼(Extended Binary-Coded Decimal Interchange Code,擴(kuò)展的二-十進(jìn)制交換碼)主要用在IBM公司的計(jì)算機(jī)中,該碼采用8位二進(jìn)制表示,因此有256個(gè)編碼狀態(tài)。
(3)中文信息編碼
在計(jì)算機(jī)中,為了解決漢字的輸入、處理及輸出問(wèn)題,設(shè)計(jì)了三套對(duì)應(yīng)的漢字編碼方案,分別為輸入碼、機(jī)內(nèi)碼、輸出碼。
①輸入碼。漢字編碼就是給漢字規(guī)定一種便于計(jì)算機(jī)識(shí)別的代碼,使每一個(gè)漢字唯一地對(duì)應(yīng)于一個(gè)數(shù)字串或符號(hào)串,從而把漢字輸入計(jì)算機(jī)。輸入碼主要有四種編碼方式:數(shù)字碼、音碼、形碼、音形碼。根據(jù)輸入碼輸入到計(jì)算機(jī)的字符還要轉(zhuǎn)換成機(jī)內(nèi)碼,計(jì)算機(jī)才能夠?qū)ψ址M(jìn)行處理。
●數(shù)字碼:漢字?jǐn)?shù)量大、字形結(jié)構(gòu)復(fù)雜、同音字和異體字多,對(duì)其編碼的復(fù)雜程度比字符編碼大得多,又由于一個(gè)字節(jié)中最多可以表示256個(gè)編碼,因此一個(gè)字節(jié)無(wú)法表示眾多的漢字編碼。因?yàn)閮蓚€(gè)字節(jié)最多可以表示65535個(gè)字符,所以,漢字編碼采用雙字節(jié)保存,即一個(gè)漢字用兩個(gè)字節(jié)來(lái)表示。目前通用的漢字編碼有兩種:國(guó)標(biāo)碼(GB—2312—1980),即簡(jiǎn)體字的標(biāo)準(zhǔn)編碼;大五碼(BIG 5)是臺(tái)灣制定的漢字編碼方法,類似于大陸的國(guó)標(biāo)碼,主要用于繁體字的表示;四角號(hào)碼編碼是新華字典中使用的編碼方法。
國(guó)標(biāo)碼是國(guó)家標(biāo)準(zhǔn)漢字編碼的簡(jiǎn)稱(Chinese Character Standard Exchange Code)。為了解決漢字的編碼問(wèn)題,國(guó)家標(biāo)準(zhǔn)局于1980年公布了標(biāo)準(zhǔn)漢字編碼,其標(biāo)準(zhǔn)號(hào)為GB 2312—1980,在此標(biāo)準(zhǔn)中共含有7445個(gè),其中6763個(gè)簡(jiǎn)化漢字,還有西文字母、數(shù)字、標(biāo)點(diǎn)符號(hào)等682個(gè)非漢字符號(hào)。國(guó)標(biāo)碼規(guī)定一個(gè)漢字由2個(gè)字節(jié)代碼表示,每個(gè)字節(jié)只使用低7位,最高位都置0,共計(jì)可表示27×27=16384個(gè)漢字。
在國(guó)標(biāo)GB 2312—1980中,國(guó)標(biāo)碼除了用雙七位二進(jìn)制表示外,還可以表示為區(qū)位碼的形式。國(guó)標(biāo)碼采用每個(gè)字符用兩個(gè)字節(jié)的低7位表示,由于每個(gè)字節(jié)有34種字符起控制作用,所以每個(gè)字節(jié)只能表達(dá)128-34=94個(gè)編碼,兩個(gè)字節(jié)可以表示94×94=8836種不同的字符。
四角號(hào)碼編碼,采用新華字典中的四角號(hào)碼的方式,將一個(gè)漢字的四個(gè)角筆畫的數(shù)字編碼,組成了一個(gè)漢字對(duì)應(yīng)的數(shù)字編碼。
●音碼:音碼是依據(jù)漢字讀音的編碼,現(xiàn)在常用的拼音輸入法有搜狗輸入法、紫光輸入法、Google輸入法、拼音輸入法,這些輸入法比早期微軟操作系統(tǒng)自帶的拼音輸入法有很大的便利性,一般都具有詞語(yǔ)簡(jiǎn)拼、聯(lián)想、記憶、專用詞匯等功能,大大方便了人們的輸入個(gè)性習(xí)慣。
●形碼:形碼是根據(jù)漢字的字形進(jìn)行編碼,最典型的有新華字典的部首,五筆字型編碼、表形碼等。
●音形碼:將漢字的拼音和字形合起來(lái)進(jìn)行編碼的方式為音形碼,主要有二筆碼等這種輸入方式?jīng)]有被廣泛地使用。
②機(jī)內(nèi)碼。漢字內(nèi)碼是在設(shè)備和信息處理系統(tǒng)內(nèi)部存儲(chǔ)、處理、傳輸漢字信息時(shí)所使用的漢字代碼。由于漢字?jǐn)?shù)量多,用一個(gè)字節(jié)的信息量無(wú)法區(qū)別所有的漢字,需要用兩個(gè)字節(jié)來(lái)存放漢字的內(nèi)碼,兩個(gè)字節(jié)共有16個(gè)二進(jìn)制位,即216=65536,也就是說(shuō)兩個(gè)字節(jié)的內(nèi)碼可區(qū)別65536個(gè)不同的漢字,這足以滿足實(shí)際應(yīng)用的需要了。
目前漢字的內(nèi)碼一般是將國(guó)標(biāo)GB 2312—1980交換碼中兩個(gè)字節(jié)的最高位分別置為1而得到,以便和英文的ASCII碼進(jìn)行區(qū)別。所以漢字的機(jī)內(nèi)碼=國(guó)標(biāo)碼+(8080)H,如漢字“啊”的內(nèi)碼為(B0A1)。
③輸出碼。為解決漢字的輸出問(wèn)題,人們研制了漢字字模庫(kù)(簡(jiǎn)稱字庫(kù))。字模是漢字字庫(kù)中存放的漢字字形,在計(jì)算機(jī)中常用兩種方法:用點(diǎn)陣字形和輪廓字形來(lái)描述漢字的字形。漢字的字形碼就是用于顯示和打印漢字字形信息的編碼。
漢字的字庫(kù)包含了每一個(gè)漢字的字形碼。用輸入碼將漢字輸入計(jì)算機(jī),計(jì)算機(jī)再通過(guò)軟件從中取出漢字的字形碼,然后顯示或打印出來(lái)。
●點(diǎn)陣字形。每個(gè)字形都以一組排成方陣的二進(jìn)制數(shù)字來(lái)表示一個(gè)漢字,有筆畫覆蓋的地方用1表示,沒(méi)有的用0表示。16×16點(diǎn)陣字形就是用16行16列的256個(gè)點(diǎn)表示漢字的字形,如漢字“三”就可用圖1-25(a)的點(diǎn)陣圖形來(lái)表示,而漢字“梅”的216×222的點(diǎn)陣圖形如圖1-25(b)所示。

圖1-25 漢字點(diǎn)陣圖形
目前,我國(guó)已制訂了國(guó)標(biāo)一級(jí)和二級(jí)漢字的16×16、24×24、32×32、48×48、64×64和128×128的點(diǎn)陣字形標(biāo)準(zhǔn),可輸出幾十種字體的大小漢字。常用的幾種漢字點(diǎn)陣類型的參數(shù)見表1-5。
點(diǎn)陣的點(diǎn)數(shù)越多,輸出的漢字就越精確美觀,但所占用的存儲(chǔ)空間就越大。常見的點(diǎn)陣字體有bdf、pcf、fnt、hbf等格式。
表1-5 漢字的點(diǎn)陣類型

【例10】計(jì)算一個(gè)漢字用48×48點(diǎn)陣顯示所使用的存儲(chǔ)空間。
由于一個(gè)漢字使用了方陣來(lái)表示,這個(gè)方陣用了48×48位二進(jìn)制,所以共占用48×48÷8=288個(gè)字節(jié)來(lái)表示。
要實(shí)現(xiàn)近8000個(gè)常用漢字和符號(hào)的顯示和打印,字庫(kù)要占很大的存儲(chǔ)空間。如48×48點(diǎn)陣的漢字庫(kù)就需要約2.2MB的存儲(chǔ)空間。
點(diǎn)陣字庫(kù)最大的缺點(diǎn)是占用較大的存儲(chǔ)空間,且點(diǎn)陣字體很難進(jìn)行放大,一旦放大后就會(huì)發(fā)現(xiàn)文字邊緣的鋸齒。特定的點(diǎn)陣字體只能清晰地顯示在相應(yīng)的字號(hào)下。
●輪廓字形。輪廓字形的表示方法就是把漢字或符號(hào)的筆畫輪廓用一組直線段或曲線段描述。其優(yōu)點(diǎn)是占用存儲(chǔ)空間小,字形質(zhì)量高,當(dāng)它無(wú)級(jí)放大或縮小及其他字形變化時(shí),其筆畫輪廓仍然能保持圓滑。如Windows中的TrueType字庫(kù)采用的就是典型的輪廓字形表示方法。
Windows使用的字庫(kù)也為以上兩類,在FONTS目錄下,如果字體擴(kuò)展名為FON,表示該文件為點(diǎn)陣字庫(kù),擴(kuò)展名為TTF則表示輪廓字庫(kù)。點(diǎn)陣字庫(kù)文件的圖標(biāo)為一個(gè)紅色的“A”,輪廓字庫(kù)圖標(biāo)是兩個(gè)“T”或“O”。
- Advanced Quantitative Finance with C++
- Power Up Your PowToon Studio Project
- Python從小白到大牛
- Web Scraping with Python
- Mastering Selenium WebDriver
- 高級(jí)C/C++編譯技術(shù)(典藏版)
- Mastering Predictive Analytics with Python
- 軟件架構(gòu):Python語(yǔ)言實(shí)現(xiàn)
- Microsoft Azure Storage Essentials
- PHP+MySQL+Dreamweaver動(dòng)態(tài)網(wǎng)站開發(fā)從入門到精通(第3版)
- PHP從入門到精通(第4版)(軟件開發(fā)視頻大講堂)
- Laravel Application Development Blueprints
- Distributed Computing in Java 9
- 高效使用Greenplum:入門、進(jìn)階與數(shù)據(jù)中臺(tái)
- R語(yǔ)言實(shí)戰(zhàn)(第2版)