引言
前面簡單介紹過位元制系統,這裡不作多的贅述。話說電腦只能識別位元制系統,這句話其實並不怎麼確切。我們知道電腦是有多個電子元件組成的,而電子元件一般都存在兩個狀態例如:通電或斷點兩個狀態),與位元制系統只有兩個數位0或1)比較類似,所以電腦的CPU內部程式集指令集)就使用0或1來表示其不同組件的電子元件的狀態,因此也就出現了電腦只能識別位元制系統這句話。
程式是由指令序列一串位元碼)組成的,其序列的排列和組合方式與具體的CPU機器有關,這個程式指令序列可以與CPU中的指令集相映射,能夠解析為具體的指令從而來支配電腦完成工作。這也就是程式的執行原理。
廢話說了這麼多,無非是想說一個問題,電腦只能識別0和1組成的位元值,那麼為什麼電腦又能呈現給我們形形色色的資訊呢?答案就是——編碼,某些時候也成為編譯。電腦中的任何程式、檔案以及符號、數值等都是按規則編碼為0和1的位元碼序列後的資訊,然後由CPU支配電子元件的不同動作而呈現不同的效果的。
數值資料表示方式
這裡所說的數值主要指某個數制系統下的所有數位以及加號或減號±)和小數點.)組成的數值,是相對其它非數值符號而言的,主要用於表示量的單位。
某個資料的真實大小即數學範圍中的大小)稱為真實值,通常真實值可分為整數、0和負數,也可分為小數和整數。而在電腦中某個資料只能通過電子訊號類比表示或通過電子元件組合類比儲存,在電腦中的數值表示稱為機器數或機器碼。機器數就是將現實中的資料使用位元碼來類比機器元件,將其訊號化,通常可分為無符號數和有符號數,有符號數又可分為正數、負數、小數等;又可分為定點數和浮點數等等,各種劃分方式都有一定的衡量標準。下面主要介紹機器數的表示方式,也就是電腦中數值資料的編碼方式。以下均以十進位電腦中的表示方式進行介紹)
1.無符號數
這裡所說的無符號數主要指無符號的整數這裡筆者把小數點和加號或減號作為符號進行劃分,所以無符號的就只有整數了,而且還是數學中的正整數,有些理解不同,請勿誤解)。
在電腦中1個位元組等於8位,也就是說一個位元組可以表示256種不同的資訊每一位都有0和1數位隨機排列組合,即得出28=256種不同的組合方式,所以說一個位元組可以表示256種不同的資訊)。先假設0用00000000來表示,1用00000001來表示,2用00000010來表示,依次類推,可以得出其最大的數位為11111111,我們將其轉換為十進位數值則分別為0、1、2……255,這就是電腦表示和儲存不帶正負號的整數的原理,不難看出電腦中一個位元組最大能夠表示的無符號的整數為範圍為0~2550~28-1)。在編程的過程中你肯定會發現任何一種數實值型別都是有其數值表示範圍的,也就是這個意思。
事實上,機器數的表示範圍受機器本身處理能力主要指CPU字長)限制,比如8位的CPU中,可以表示的無符號機器數範圍為0~28-1,其使用一個位元組表示一個數值,例如00000000表示0,00000001表示1,00000010表示2,依次類推;16位的CPU中,可以表示的無符號機器數範圍為0~216-1,其使用兩個位元組表示一個數值,例如00000000 00000000表示0,00000000 00000001表示1,00000000 00000010表示2,依次類推;32位CPU中,可以表示的無符號機器數範圍為0~232-1,其使用四個位元組表示一個數值;64位CPU中,可以表示的無符號機器數範圍為0~264-1,其使用八個位元組表示一個數值。可以看出CPU字長越長,其表示的資料範圍越大,當然計算就越精確,但是其計算速度會相應下降。
無符號資料使用與機器相關的位元來表示,範圍為0~2n-1n表示機器位元)。無符號資料在電腦中表示相對比較簡單,給定一個無符號的位元碼則可以輕鬆的轉換為其對應的十進位數值。
2.有符號數
這裡所說的有符號的數主要指正負數和小數這裡筆者把小數點和加號或減號作為符號進行劃分,所以有符號的就就是正負數和小數,有些理解不同,請勿誤解)。
由於電腦只能識別0和1兩種符號,所以像數學中的加號或減號“+”、“-”)和小數點“.”)這些符號其都無法識別,只能使用0或1來代替,由於0和1預設都表示數值,所以只能通過數位元碼的位置)來描述加號或減號或小數點,這個過程稱為“符號的數字化”過程。
根據小數點位置的固定與否可以將數值分為定點數和浮點數兩大類。定點數就是小數點的位置固定不變的數值;浮點數就是小數點的位置不能固定的數值。
2.1.定點數表示
定點數就是小數點位置固定不變的資料,可以表示所有的整數和小於1且大於0或大於-1且小於0的所有小數。因為整數的小數點固定在其數值的最右邊,而大於-1小於0或小於1或大於0的小數的小數點固定在其數值的最左邊。
數有正負之分,電腦中對加號或減號的數字化過程規定,位元碼序列的最高位表示符號位,用來決定數值的正負形式;符號位上使用“0”表示正號“+”),使用“1”表示負號“-”。由於位元碼序列的最高位稱為符號位,不具有實際數值意義,所以位元的形式值與其真值存在差異。比如在8位的機器中,位元值00000001表示十進位的+1,而10000001則表示十進位的-1。有符號的整數可以使用以下通用方式進行描述:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/00012244c-0.png" title="有符號整數表示" width="180" height="26" border="0" hspace="0" vspace="0" style="width:180px;height:26px;" alt="220010592.png" />
其中“S”表示符號位0表示“+”、1表示“-”),佔一位;“M”表示數值位,佔多位。整體表示一個二進位的正負數值。
對於定點小數一樣,其也儲存正負之分,其最高位表示符號位,其他位表示數值位,而其小數點則是固定在其符號位和數值位之間。這裡不做多的介紹,其表示方式與整數非常類似,例如00000001可以表示0.1,而10000001則可以表示-0.1。
從對不帶正負號的整數的介紹中可以知道,電腦中一個位元組可以表示256種不同的數值,對於無符號的數值的範圍可以看作0~28-1即0~255),而對於有符號的數值,其每一種標記法的最高位作為符號位進行處理,沒有實際數值意義,則最小為11111111-127),最大為01111111+127),所以其能夠表示的有符號的整數數值範圍為-127~+127-27+1~+27-1);從另一個角度分析,其一個位元組可以表示的有符號的小數範圍則為-0.127~+0.127。事實上,不同的CPU字長所表示的有符號數值範圍有所不同,具體與機器本身有關。
2.2.浮點數表示
上面主要介紹的是整數的表示方式,而關於小數的表示不僅需要考慮其正負符號,還需要考慮其小數點的位置。由於過於複雜,所以大多數的資料文獻都是一筆帶過。這裡也簡單的介紹一下。
小數根據小數點的位置固定與否可分為定點小數或浮點小數兩大類。定點小數上面也提到過,由於其小數點的位置固定不變,所以其表示方式與整數表示方式非常相似。這裡主要介紹一下浮點小數的表示方式。
浮點小數是小數點位置不固定的小數形式,由於其小數點位置不固定,所以並不能像定點小數那樣表示,首先其也有正負之分,所以必須使用一位來作為符號位表示其數值的正負,其次為了暫存資料表示其小數點的位置必須使用幾個數位來描述小數點的位置,再次就是要表示數值的大小,其通用格式如:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/00012211A-1.png" title="有符號浮點數表示" width="226" height="26" border="0" hspace="0" vspace="0" style="width:226px;height:26px;" alt="220406995.png" />
其中“S”表示符號位0表示“+”、1表示“-”),佔一位;“P”表示階碼,即用來描述小數點的位置;“M”表示數值位,佔多位。整體表示一個二進位的正負浮點數值。
浮點數的階碼通常使用移碼的方式來表示,在電腦中的浮點數階碼是一個n位的整數,表示2的指數,可以有符號。移碼固定對於一個n為的階碼N,其移碼公式為:
N移=2n-1+N (-2n-1≤N<2n-1)
N移=1+N (-1≤N<1)
其中N表示階碼數值,n表示階碼位元。具體的內容可自行深究。
在電腦中以近似值表示所有的實數,類似於十進位中的科學計數法,電腦中的浮點數可以表示為N=2n×S,其中2n稱為數N的指數也成為階碼),用於表示小數點的具體位置;S為數N的尾數部分,用於表示數的符號和有效數值。為了更精確的表示浮點數,現在的同樣浮點數表示規範如:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/0001223253-2.png" title="有符號浮點數表示" width="331" height="30" border="0" hspace="0" vspace="0" style="width:331px;height:30px;" alt="221808840.png" />
其中階符和階碼合在一起用來表示小數點的位置,並且規定階碼必須為整數;尾符和尾碼用來表示小數的精度,並且固定尾碼必須是定點小數,尾碼的數值絕對值必須大於0.1並且小於1;階符和尾符分別佔一位,0表示正,1表示負,階碼和尾碼根據機器不同和浮點數精度不同所佔位元要求不同。例如0.1011×2100與0.01011×2101兩種表示方式,在我們看來都是一樣的,但是機器是有一定位元限制的,如果尾數部分只存在4位,則第二種表示方式將存在誤差,所以為了減小誤差,規定尾碼的絕對值必須大於0.1並且小於1。比如在8位的機器中,二進位浮點數N=210×0.1010其對應的機器數為01001010,各位表示含義如:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/0001226156-3.png" title="浮點數樣本" width="451" height="170" border="0" hspace="0" vspace="0" style="width:451px;height:170px;" alt="222101511.png" />
如果是二進位浮點數N=210×-0.1010其對應的機器數為01011010,如果是二進位浮點數N=2-10×-0.1010其對應的機器數為11011010。
二進位浮點數中的階碼用於決定數的範圍,如果不給定其佔用位元,則很難決定其所能表示的小數數值範圍。當二進位浮點數的尾數為0其表示機器數零,當其階碼為最小時該浮點數最接近於零,可在所能表示的範圍內近視為零。浮點數的尾數是決定了該浮點數的基帶大小,都是以定點小數來表示的,類似整數的表示方式,浮點數的運算層級都是將位元進行運算。
數值的編碼和運算
電腦數值可劃分為有符號和無符號兩大類,無符號主要是指0和正整數;有符號的數值主要指正負數和0。無符號的數值編碼相對比較簡單,使用指定位元與機器有關)的位元碼序列直接表示即可,其運算也相對簡單,每一位均參與運算;而有符號的整數和定點小數在編碼過程中均需要提供一個數位作為符號位用來表示其數值的加號或減號,因為其減少了一位有效數值位,所以其運算過程相對較為複雜;而有符號的浮點小數在編碼過程中不僅需要提供一個數位來表示其數值的正負,還需要多個數位來表示其小數點的位置,所以其運算過程更為複雜。
其實在大多數情況下我們使用的都是有符號的數值,那麼電腦到底如何儲存如何運算呢?下面就來探討一下電腦到底是如何進行有符號數值運算的。
1.原碼、反碼和補碼
電腦中有符號數值編碼方式存在三種形式——原碼、反碼和補碼,下面一一簡單介紹。
1.1.原碼
使用數位表示數值符號的方式稱為原碼。即在位元碼序列中最高位表示符號位,使用0表示正號,1表示符號;除過符號位其他所有位表示數值的大小,這種表示數值的方式稱為原碼錶示法。例如在8位的機器中1的原碼為00000001,而-1的原碼為10000001,其位元值中的左邊最高位不同。不難看出0儲存兩種原碼錶示方式00000000或10000000。從數學的角度去解釋,可使用一下公式得出原碼:
N原=N (0≤N<2n-1)
N原=2n-1+|N| (-2n-1<N≤0)
N原=N (0≤N<1)
N原=20+|N| (-1<N≤0)
其中N表示一個n位的二進位機器數,n表示機器字長。
原碼是有符號資料在電腦中的最簡單的編碼方式,主要用於輸入輸出資料,由於其與真值之間儲存誤差,所以並不能直接參与運算。對於一個字長為n的機器,其能夠表示的資料個數為2n個;其能夠表示的無符號的資料範圍為0~2n-1;其能夠表示的有符號的資料範圍為-2n-1+1~+2n-1-1。
再來看看原碼是否能夠參與運算?例如使用原碼來計算十進位算式-1+1,以8位的機器為例,-1的原碼為10000001,1的原碼為00000001,10000001+00000001=100000010,將其結果轉為十進位就是-2,顯然是錯誤的。我們來分析一下,為什嗎?原碼的最高位表示的是數值的符號,並不表示數值的大小,而上面的算式中將其作為數值的大小進行運算顯示是錯誤的。所以得出一個結論:原碼不能參與運算;如果非要強制運算,其符號位絕對不能參與運算,但是其結果的符號又該如何給定,需要比較未經處理資料的大小來給定。
1.2.反碼
就對上面的使用原碼計算-1+1的例子來看,其結果是-2,顯示是錯誤的。我們知道-1+1=0,而通過原碼計算後得到的結果為-2,主要是由於其符號位參與了運算導致錯誤的出現。電腦在處理資料時只能將其每一位作為數位進行運算,如果將符號位提取出來單獨處理則過於複雜,經過研究也就出現了一種新的有符號資料表示方式——反碼。
反碼是電腦中表示數值的另一種方式,主要用於表示負數。反碼規定正數的反碼形式與其原碼形式相同;負數的反碼形式是在其原碼形式的基礎上除過符號位按位取反的結果。這裡的“取反”就是二進位中的邏輯非運算,即如果某一位上為1則取反後為0,如果為0則取反後為1。比如8位機器碼000000011)的反碼為00000001,10000001-1)的反碼為11111110。不難看出0儲存兩種反碼錶示方式00000000或11111111。從數學的角度去解釋,可使用一下公式得出反碼:
N反=N (0≤N<2n-1)
N反=(2n-1)+N (-2n-1≤N≤0)
N反=N (0≤N<1)
N反=2-2-(n-1)+N (-1<N≤0)
其中N表示一個n位的二進位機器數,n表示機器字長。
反碼主要是相對原碼而言的,其表示資料的範圍與原碼一一對應,而反碼與原碼的區別就是其可以直接參与運算。下面來看反碼如何參與運算,還以開頭的例子為例,-1的反碼是11111110,1的反碼是00000001,其-1+1的反碼運算就是11111110+00000001=11111111,其原碼為10000000,換算為十進位就是-0。再來看使用反碼計算1-2,在8位的機器中,原碼形式為00000001+10000010,反碼形式為00000001+11111101=11111110,其結果的原碼為10000001,換算為有符號的十進位數值則為-1。顯然可以看成反碼可以解決原碼符號位不能參與運算的問題。
1.3.補碼
或許你會發現,反碼雖然解決了原碼的本質問題符號位不能參與運算),但是上面通過反碼運算-1+1得到的結果為-0,然而這並不符號現實邏輯,因為現實中不存在正負零之分,雖然得到了想要的結果,但是並不合理。為了更合理的運算,就出現的另一種資料表示方式——補碼。什麼是補碼?暫且不說,且先看看“模”的概念。
在數學代數中,模表示一種代數體系,可視為一個環形的代數體系,最簡單的模型就是“鐘錶”,在該計量器中,可以看到其所表示的量的範圍為1~1212個量),則其模為12。例如3點這個量,既可以看作12點逆轉9個量,也可以看作12點正轉3個量,也就是說,在鐘錶中3=12-9=12+(12-9)=15,可以將減去9的運算等價為加上3的運算。可以得出一個特點,在模內的減法運算都可以轉化為對應的加法運算。從另一個角度看,模為12的計量器中,3和15儲存一個共同的特點,其除以12的餘數都是3,這時稱為3和15為同餘的數,也成為互補的數。同餘是模計量器中的一個概念,模中A、B兩個數除以模數N得到的餘數相同,則稱為A、B同餘。互補也是模計量器中的一個概念,在模N的計量器中,一個數A與N-A是一對互補的數,其特點是可以將減法轉換成加法,例如X-A=X+(X-A)。
在電腦中模表示一種計量系統的計數範圍,我們知道對應一個n位的機器,其計量範圍為0~2n-1共2n個量),則其模就是2n。我們可以看出電腦中模的概念與鐘錶的模型非常類似,藉助可以將減法轉換為加法的思路,為了進一步簡化電腦中的電路設計,所以就誕生了補碼的概念。
補碼是電腦中表示有符號數值的一種方式,補碼錶示方式規定正數的補碼形式也其原碼形式一致;負數的補碼形式是在其反碼的數值位除符號位外)末位加1,並且丟棄最高進位。例如8位的機器中,1的原碼為00000001,其補碼也為00000001;而-1的原碼為10000001,其反碼為11111110,其補碼為11111111,可以看出0隻儲存一種補碼。由於0的補碼只有一種方式,所以多出一中數值量,規定使用-128來代替原有的負零-128並沒有對應的原碼和反碼,其實質是一種溢出的數值100000000),所以在8為的機器中其補碼的表示資料範圍為-128~0~127;也就是說對於n位的機器,其補碼的表示範圍與原碼和反碼稍有不同,為-2n~0~2n-1共2n個數值量)。從數學的角度去解釋,可使用一下公式得出補碼:
N補=N (0≤N<2n-1)
N補=2n+N (-2n-1≤N≤0)
N補=N (0≤N<1)
N補=2+N (-1≤N<0)
其中N表示一個n位的二進位機器數,n表示機器字長。
補碼是根據反碼得出來的,主要通過互補的概念衍生的,補碼的應用能夠使電腦二進位運算進一步簡化,而且符號位可以參與運算,比反碼更為合理。來看一下-1+1的補碼運算,其原碼形式為10000001+00000001,其反碼形式為11111110+00000001,其補碼形式為11111111+00000001=100000000,轉換為反碼為11111111,轉換為原碼則為00000000,即0。
從上面的例子可以看出補碼的運算比反碼的運算更為合理,所以在電腦中所有的數位均以補碼的方式進行表示或儲存,以補碼的方式進行運算。
1.4.總結
在電腦中所表示數值的範圍與機器字長有關,而在程式設計語言中所表示的資料範圍與規定位元組有關。電腦中對有符號的數值編碼方式分為原碼、反碼和補碼三種,其中主要使用補碼進行資料的運算和儲存,由於補碼錶示法中可以將符號位直接參与運算,同時還能將所有的減法運算轉化為加法運算。
原碼規定有符號的位元據的最高位第n位)為符號位,其餘n-1位為數值位;如果符號位為0則表示真值為正數,如果符號位為1則表示真值為負數。
反碼規定真值為正數時其反碼與原碼相同;真值為負數時其反碼為原碼基礎上除符號位外逐位取反。
補碼規定真值為正數時其補碼與原碼相同;真值為負數時補碼為反碼基礎上最低位加1,並捨棄符號位進位不能超過機器字長)。
對於一個正數其原碼、反碼、補碼與其數值位完全相同;對於一個負數其符號位為1不變,原碼的數值位與其數值位相同,反碼的數值位為其數值位各位取反,補碼在反碼的最低位加1。
資料的反碼的反碼等於該資料的原碼;資料的補碼的補碼等於該資料的原碼。
在電腦內部,帶符號的資料均使用補碼的方式表示,使用補碼形式進行運算後結果也是補碼形式,如需得到真值,需要轉換。如果結果的符號位為0,則將0轉換為正號“+”),數值位不變;如果結果的符號位為1,則將0轉換為負號“-”),數值位或者減1求反或者求反加1。
2.定點數的運算
關於定點數的運算,相對較為簡單,只需要將其補碼形式進行運算即可。比如計算3-5,下面以8位機器為例,首先看一下其3和5對應的原碼、反碼、補碼對應列表:
真值 |
原碼 |
反碼 |
補碼 |
3 |
00000011 |
00000011 |
00000011 |
-5 |
10000101 |
11111010 |
11111011 |
計算3-5實質就是計算3與-5的補碼和,3-5=3+(-5)=00000011+11111011=11111110,轉換為反碼為11111101,再轉換為原碼則為10000010,即為十進位的-2。
電腦中定點數的運算均是將其對應的補碼進行和運算,然後將結果在轉換為原碼即可得出最終運算結果。
3.浮點數的運算
浮點數的運算,相對較為複雜,這裡簡單介紹一下浮點數的運算思路。
浮點數主要有階碼和尾碼組成,階碼錶示了浮點數的數值範圍,而尾碼錶示了浮點數的數值精度,所以如果其階碼不同則無法參與運算。當參與運算的浮點數的階碼相同時,則直接將其尾碼進行對應補碼的運算即可,最後將結果在轉換為對應的原碼則就是其最終結果;當參與運算的浮點數的階碼不同時,首先要進行對階操作,也就是將其按某一個精度轉換為相同的階碼過程就是除以或乘以21),然後再將其尾碼進行對應補碼的運算,最後將結果在轉換為對應的原碼則就是其最終結果。
4.溢出
“溢出”是電腦中常用的術語,簡單的將就是某個值不能被電腦記憶體所表示,某個值位元碼超出了機器所能容納的最大位元。準確的說就是當兩個有符號的資料進行運算時,得到的結果超出了當前機器可以表示的有符號的資料範圍對於一個n位的機器來說,所能表示的有符號的資料範圍為-2n-1+1~+2n-1-1,其中包括正負零,這裡先不說正負零的問題),就出現了“溢出”的現象。那麼如何解決溢出問題,這是機器的事情,這裡不說,我們需要有效預防即可。
當加法運算過程中出現“進位”時,但是該進位已經超出了數值位的長度時則會出現“上溢出”現象;當加法運算過程中出現“借位”時,但是該借位已經超出了數值位的長度時則會出現“下溢出”現象。
非數值資料編碼
電腦處理的資訊包括數值、檔案、符號、語音、圖形、映像等。在電腦內部各種資訊都必須以數字化的二進位編碼形式傳送、儲存和加工,因此,不管是什麼資訊都應轉化為二進位編碼。編碼的過程可以通過少量的位元位,通過一定的組合規則,表示出大量複雜多樣的資訊。以下主要介紹十進位數值編碼、英文字元編碼和中文字元編碼三種編碼方式,只是簡單介紹,具體原理須自行深究。
1.BCD碼
電腦內部使用二進位表示所有的資料,而我們習慣使用十進位。在數字系統中除了採用機器數表示位元以外,有時需要用若干位位元表示一位十進位數,以便能在數字系統中表示和使用十進位數,適應處理十進位數的需要,所以就誕生了一種使用二進位碼錶示十進位數的編碼方案——BCD碼。
BCDBinary Coded Decimal)碼是一種通過四位二進位碼錶示一位十進位數的編碼方法。其特點是:四位二進位碼本身的指就是其對應的十進位數位的真值。四位二進位各位的位權由高到低分別為23、22、21、20,因此也稱為8421碼。8421碼與十進位數位的編碼規則如:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/0001224543-4.png" title="8421BCD碼錶" width="450" height="176" border="0" hspace="0" vspace="0" style="width:450px;height:176px;" alt="225218492.png" />
例如,十進位的3的BCD碼為0011,十進位的931的BCD碼為1001 0011 0001。這是一種編碼方式,並非其二進位原碼錶示方式。如果電腦使用BCD碼進行十進位數值編碼,那麼其在電腦中的編碼儲存方式將以BCD碼儲存,電腦需要內建對應的BCD碼編碼和解碼演算法來實現其處理過程。
2.ASCII編碼
因為電腦採用高低電平來分別類比1和0兩個數位,所以電腦只能儲存和傳輸位元碼。為了能夠使用一種統一的方式表示數字字元數字字元與數字是不同的概念)、字母字元以及常用符號,所以就產生了另一種國際化的標準編碼方式——ASCII編碼。
ASCII美國標準資訊交換碼)是基於拉丁字母的一套電腦編碼系統,可以對現代英語和其它西歐語言進行編碼,是一種單位元組字元編碼方案,主要用於文本資料編碼,用於電腦與電腦、電腦與外設之間傳遞資訊。
ASCII規定使用8位一個位元組)位元碼組合來表示128或256種可能的字元,所以稱為單位元組編碼。標準的ASCII碼最高位為0,使用7位位元碼來表示所有的大小寫字母、數字0-9、標點符號以及美式英語中使用的特殊控制字元。當固定最高位為0後,其餘7位可能表示的有效字元為27=128個,分別對應十進位的0~127共128個數值。標準ASCII編碼與字元對照表如:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/000122E32-5.png" title="標準ASCII編碼對照表" width="450" height="336" border="0" hspace="0" vspace="0" style="width:450px;height:336px;" alt="225420794.png" />
其中第一行表示前四位編碼,第一列表示後四位編碼,其組合的編碼對應的符號中黃色部分,將其組合的結果轉換為十進位數值的範圍為0~127。其中0~31及127代表的33個字元是電腦的控制字元或通訊專用字元,32~126代表的95個字元稱為可顯字元其中SP表示space空格符號),即有特定的圖形顯示。可顯字元中48~57表示0~9十個數字,65~90表示26個大寫英文字母,97~122表示26個小寫英文字母,其它的表示一些常見標點符號和運算子等。例如字串“Hello”使用ASCII編碼後在記憶體單元中的編碼為01001000 01100101 01101100 01101100 01101111。
由於標準的ASCII碼只能表示128個符號,遠遠不能滿足現實中的符號要求,所以後來就將標準ASCII碼的最高位也用作編碼位,這樣就又多出了128個符號,這些符號稱為擴充ASCII碼,其能夠對大部分的西歐符號進行表示。由於ASCII碼通用性較為廣泛,所以我們將ASCII單位元組編碼的字元稱為ASCII字元。
3.漢字編碼
漢字的特點是表意字元,單字單音,而且資料非常龐大,字形複雜,要在電腦中以二進位序列的方式表示一個漢字,遠遠要比ASCII碼複雜。所以規定漢字在輸入、輸出、儲存和處理過程中所使用的漢字編碼均不相同。
電腦中漢字的表示同樣需要使用固定的二進位進行編碼,根據應用目的的不同,漢字編碼可分為外碼、交換碼、機內碼和字形碼四種方式。
3.1.外碼輸入碼)
外碼也稱為輸入碼,是用來將漢字輸入到電腦中的一組鍵盤符號,即就是通過鍵盤輸入的各種字元符號序列。常用的輸入碼有拼音碼、五筆字型碼、自然碼、表形碼、認知碼、區位碼和電報碼等。
我們知道漢字的輸入方式也成為IME)存在多種多樣,外碼則是由漢字IME管理的,例如使用拼音輸入zhong1,表示“中”這個漢字,那麼“zhong1”則就是漢字“中”的外碼。外碼只是一種識別漢字的編碼方式,通過外碼可以在IME程式中找到合適的漢字,不論某一個漢字的外碼如何變化,但是其機器碼位元碼)是不變的,當我們輸入外碼後會通過對應的演算法程式將漢字轉換為對應的機器碼。
3.2.交換碼國標碼)
電腦中以二進位代碼的方式表示一個漢字,而二進位代碼使用起來並不方便,所以需要使用一種方便的編碼來與二進位編碼進行映射,於是就出現了交換碼。漢字資訊交換碼簡稱為“國標碼”即GB2312-80編碼通訊協定,該標準中收入了6763個常用漢字其中一級漢字3755個,二級漢字3008個),以及英、俄、日文字母與其他符號687個,一共7000多個符號。
國標碼的編碼規則是:每個漢字由一個2位元組(16位二進位)編碼組成,每個位元組的最高位置“0”,其餘7位用於組成各種不同的碼值。為了不與ASCII碼的控制字元相同,每個位元組剔除了34個ASCII碼的控制字元,每個位元組還剩94個編碼。兩個位元組組成一個二維結構,前一個位元組稱“區”,後一個位元組稱“位”,所以國標碼也稱為區位碼,一共可以表示94×94個即8836個漢字以及其他符號。已被佔用7000多個符號,剩餘的位置作為備用。
3.3.機內碼內碼)
漢字的機器碼是電腦內部儲存和處理漢字的代碼,簡稱“內碼”。內碼描述的是電腦中漢字的實際表示方式。機內碼是電腦內部儲存和加工漢字時所用的代碼。不管用何種漢字輸入碼將漢字輸入電腦,為儲存和處理方便,都需將各種輸入碼轉換成長度一致的漢字內部碼。
漢字資訊機內碼編碼規則:在國標碼的基礎上,把2個位元組的最高位一律由“0”改“1”構成。若最高位為“1”,視為漢字編碼,為“0”,視為ASCII字元。因此,同一個漢字的交換碼和機內碼並不相同,而同一個ASCII字元的交換碼和機內碼則相同。
3.4.字形碼
漢字字形碼是漢字輸出碼,是漢字顯示、列印的圖形編碼,又稱為字模碼。電腦在輸出漢字時都採用圖形方式,無聊漢字的筆畫多少,每個漢字都可以寫在同樣大小的方塊中。通常使用16×16點陣方式來顯示漢字。
總結
電腦通過電子元件電平的高低來類比位元碼1和0,儲存在電腦中的任何資訊都必須以位元碼的方式出現才能完成處理工作,原始的位元碼序列稱為資訊的機器碼,位元碼通過補碼的方式才能完美的進行運算。為了能夠描述更多的符號資訊,出現了各種符號資訊的編碼規範,編碼是將任何一個符號轉換為電腦能識別的位元碼序列的過程。
再說後話,本篇的內容或許對大多數的人來說都是“班門弄斧”,筆者是半道入行IT的,對電腦基礎知識瞭解甚少不明說,你懂得),這些內容都是筆者通過各種文獻資料總結的,不對的地方肯定有,所以希望大家不要見笑,多多噴墨……
本文出自 “阿酷呆” 部落格,請務必保留此出處http://akudy.blog.51cto.com/2277883/1300810