- 單片機原理與應用:基于Keil+Proteus
- 陳志英 徐敏主編
- 5552字
- 2022-12-14 19:54:29
1.5 計算機中的數與編碼
計算機內部信息分為兩大類:控制信息和數據信息??刂菩畔⒂糜谥笓]計算機如何操作;數據信息是計算機操作的對象,它既可以用于表示數量的大小,也可以表示字符、漢字等。對于計算機而言,不論是控制命令還是數據信息,都要用“0”和“1”兩個基本符號編碼來表示。這種方式叫作二進制表示法。
在日常生活中人們最熟悉、使用最多的是十進制,數字用“0,1,…,9”10個符號表示,基于計算機本身的硬件結構,計算機中多采用二進制來表示和存儲數據,但直接使用二進制數,由于位數較長,書寫、閱讀和記憶都不方便,因此,在計算機語言表達上,常采用十六進制,而計算機與人的信息交換又多用十進制。為了區分不同的進制,一般在數字后面加上數制字符,例如,2代表二進制,10代表十進制,16代表十六進制;也可以用字母來表示數制,B(Binary)代表二進制,D(Decimal)代表十進制,H(Hexadecimal)代表十六進制。
1.5.1 計算機中的數制
1.二進制數的表示法
二進制計數法的特點如下。
1)需要2個數字符號:0,1。
2)以2為底,逢2進位。
二進制數用尾綴B作為標識符。
二進制只有兩個數碼,即0和1,在電子計算機中容易實現。例如,用“1”表示高電平,用“0”表示低電平;還可表示脈沖的正負極等。二進制編碼、加減運算規則簡單。此外,二進制碼的兩個符號“1”和“0”還與邏輯數據“真”和“假”相對應,為邏輯運行帶來了方便。
所有二進制數表示的大小都可以按“權”展開:
(NUM)B=kn-1×2n-1+kn-2×2n-2+…+k1×21+k0×20+k-1×2-1+…+k-m×2-m
其中,2n(如22、21、20、2-1、2-2)稱為二進制數各數位的“權”。
【例1.1】1001.011B=1×23+1×20+1×2-2+1×2-3=9.375
2.十六進制數的表示法
十六進制計數法的特點如下。
1)需要16個數字符號:0,1,2,…,9,A,B,C,D,E,F。
2)以16為底,逢16進位。
十六進制數用尾綴H表示。
任意一個十六進制數(NUM)H也都可以按權展開:
(NUM)H=kn-1×16n-1+kn-2×16n-2+…+k1×161+k0×160+k-1×16-1+…+k-m×16-m
其中,16n(如162、161、160、16-1、16-2)稱為十六進制數各數位的“權”。
【例1.2】23A8.4H=2×163+3×162+A×161+8×160+4×16-1=9128.25
由于二進制位數太長,不易記憶和書寫,所以常采用十六進制的書寫方式。4位二進制數可表示1位十六進制數,例如0010對應十六進制數的2,1110對應十六進制數的E。
表1.1列出了一些自然數在十進制、二進制、十六進制這三種不同數制中的對照關系。
表1.1 部分自然數的三種進制表示

1.5.2 數制之間的轉換
人們習慣用的進制數是十進制數,而計算機內部唯一能識別的是二進制數,因此,掌握各種數制之間的相互轉換是很重要的。
下面介紹幾種最常用的進制轉換。
1.二進制、十六進制數轉換為十進制數
將一個二進制或十六進制數轉換成十進制數,只要將此數按權展開,按十進制規律相加,結果就是要轉換的十進制數。例如:
101B=1×23+1×21+1×20=11
1EFH=1×162+E×161+F×160=495
2.十進制數轉換成十六進制數
十進制數轉換為十六進制數時,其整數部分和小數部分是分別轉換的。具體如下。
(1)十進制整數轉換成十六進制整數
方法:除16取余法。
具體步驟:將十進制數除以16,得到一個商和一個余數;再將商除以16,又得到一個商和一個余數;繼續這個過程,直到商等于0為止。每次得到的余數就是對應十六進制數的各位數字。第一次得到的余數為十六進制數的最低位,最后一次得到的余數為十六進制數的最高位。
【例1.3】638=(?)H

得到:638=27EH
(2)十進制小數轉換成十六進制小數
方法:乘16取整法。
具體步驟:用16乘以十進制小數,得到一個整數和一個小數部分;再將16乘以小數部分,又得到一個整數和一個小數;繼續這個過程,直到余下的小數部分等于0為止;最后將每次得到的整數部分按先后順序從左到右排列,就得到所對應的十六進制小數。
【例1.4】0.4635=(?)H

得到:0.4635=0.76AH
注意:小數轉換不一定能乘盡,只需要算到一定精度的位數即可,因此可能會有一定的誤差。轉換位數越多,誤差越小。
3.二進制數與十六進制數之間的轉換
4位二進制數表示的數值相當于1位十六進制數表示的數值。因此彼此間的相互轉換極為方便,只要從小數點開始分別向左右展開即可。
二進制數轉換成十六進制數:整數部分從右(最低位)向左將二進制每4位分為1組,最高位一組不足4位時應在左邊加0,以湊成4位1組,每一組用1位十六進制數表示;小數部分從小數點起從左至右將二進制數每4位分為1組,最低位一組不足4位時應在右邊加0,以湊成4位1組,每一組用1位十六進制數表示。
十六進制數轉換成二進制數:把每個十六進制數用4位二進制數表示。
【例1.5】1111011.10011B=0111 1011.1001 1000B=7B.98H
6B3EH=0110 1011 0011 1110B
可以看出,十六進制表示的數據信息很容易轉換成二進制表示,且十六進制數書寫較二進制簡短,這就是普遍使用十六進制的原因。
4.十進制數轉換成二進制數
十進制數轉換二進制數,整數部分除2取余,小數部分乘2取整。具體計算方法與十進制數轉換成十六進制數相似。計算過程中,可以先把十進制數轉換成十六進制數,再轉換成二進制數。
1.5.3 原碼、反碼、補碼
計算機中的數通常有兩種:無符號數和有符號數。無符號數由于不帶符號,表示時比較簡單,直接用它對應的二進制數形式表示。除了無符號數,日常生活中,還有大量有符號數。數的符號有正有負,通常在計算機中表示有符號數時,二進制數的最高位作符號位,“0”表示“+”,“1”表示“-”,其余的位用0和1表示數的大小。這種連同一個符號位在一起作為一個數,稱為機器數,它的數值稱為機器數的真值。
機器數:機器中數的表示形式,位數通常為8的倍數。
真值:機器數所代表的實際數值。
【例1.6】一個8位機器數與它的真值對應關系如下:
真值:X1=+84=+1010100B X2=-84=-1010100B
機器數:[X1]機=01010100 [X2]機=11010100
機器數在計算機中有三種表示法:原碼、反碼和補碼。
1.原碼
原碼表示時,在一個字節中,最高位為符號位,“0”表示“+”,“1”表示“-”,而后7位為二進制數的數值位,數值位與真值數值位相同。通常用[X]原表示。設計算機字長是8位,則:
[+127]原=01111111?。?56]原=00111000?。?0]原=00000000
[-127]原=11111111?。?56]原=10111000?。?0]原=10000000
【例1.7】求+63、-34的原碼。
|+63|=111111B [+63]原=00111111B
|-34|=100010B?。?34]原=10100010B
原碼表示簡單直觀,但0的表示不唯一,有兩種數值,即00000000B(+0)和10000000B(-0),加減運算復雜,先要判斷符號位,還要比大小,因此在計算機進行數值運算時一般不采用原碼運算,為此,引入了反碼和補碼的概念。
2.反碼
反碼表示時,正數的反碼與原碼表示相同,負數的反碼其符號位為1,數值位為原碼數值各位取反。
【例1.8】求+63、-34的反碼。
[+63]原=00111111B?。?63]反=00111111B
[-34]原=10100010B?。?34]反=11011101B
反碼表示“0”時,(-0)的反碼為11111111B,(+0)的反碼為00000000B,0的表達不唯一。在數值運算中也易出錯。
3.補碼
補碼表示時,正數的補碼表示與原碼相同,負數的補碼的符號位為1,數值位等于反碼加1。
【例1.9】求+63、-34的補碼。
[+63]反=00111111B?。?63]補=00111111B
[-34]反=11011101B?。?34]補=11011110B
[+0]補=[+0]反=[+0]原=00000000B=00H
在求(-0)的補碼時,我們會發現[-0]原=10000000B,[-0]反=11111111B,加1后得到100000000B(100H),最高位溢出,得到[-0]補=00000000B。
也就是說,用補碼表示“0”時,只有一種數值,是唯一的。這樣,用補碼把減法運算轉換為加法運算中結果是完全正確的,加減運算十分方便。
對于一個負數X,X的補碼也可用2n-|x|得到,其中n為計算機字長?;蛘哒f,一個補碼X,所表示的值也可以按權展開:
(NUM)B=-kn-1×2n-1+kn-2×2n-2+…+k1×21+k0×20+k-1×2-1+…+k-m×2-m
【例1.10】求補碼C7H所表示的值。
C7H=11000111B=-1×27+1×26+1×22+1×21+1×20=-57
可見,在計算機中,不管是原碼、反碼還是補碼,如果是正數則都相同,區別僅在負數上。
在計算機中,最容易實現的運算是加法運算,而減法運算則較復雜,如果使用補碼,則減法運算就可以轉化為加法運算。
補碼的加減法有如下運算規則:
[X+Y]補=[X]補+[Y]補
[X-Y]補=[X]補+[-Y]補
對于[-Y]補,也可以由[Y]補求出。即把[Y]補的符號與數值位一起取反.末位加1,結果就等于[-Y]補。
【例1.11】完成63+34的補碼運算:

【例1.12】完成63-34的補碼運算:

表1.2列出了8位二進制數碼與無符號數、原碼、反碼、補碼的相對應關系。由表可見8位二進制數碼表示的范圍為0~255;表示原碼為-127~+127;表示反碼為-127~+127;表示補碼為-128~+127。
表1.2 數的表示方法

在計算機中,得到一個數的反碼很容易,因而得到一個數的補碼也很容易。使用了補碼后,運算時符號位與有效值部分一起參加運算,從而簡化了運算規則,很多運算變得容易;補碼表示法能使減法運算轉換為加法運算,簡化了計算機的硬件結構,控制線路變得簡單;因而,目前多數計算機采用補碼存儲和補碼運算,其結果也是補碼形式。
1.5.4 二進制數的算術運算
在計算機運算中算術運算主要是二進制數的運算。而二進制的算術運算與十進制的算術運算原則基本相同,不同的是二進制進位計算時逢二進一,借位時借一當二。
1.無符號數的算術運算
無符號數的算術運算有加、減、乘、除,其運算規則與十進制相同。運算規則如下:
加法規則:0+0=0;0+1=1;1+0=1;1+1=0(進1)。
乘法規則:0×0=0;0×1=0;1×0=0;1×1=1。
無符號數因為不用符號位,8位全部用來表示數據,所以這種方法可以表示的數據范圍是0~255。
2.有符號數的算術運算
通常計算機內的有符號數皆為其補碼形式,所以補碼的算術運算規則就是有符號數的算術運算規則。
若兩數作加減法,可不考慮兩數的符號,直接用補碼相加減,如果計算結果在字長為8位的計算機中,并且計算結果不超出補碼的計數范圍(-128~+127),這時的進位可以視為自然丟棄。在計算機處理中,這種自然丟棄并不影響結果的正確性。如果結果超出補碼的計數范圍則其進位稱之為溢出。
溢出與自然丟棄的判別方法是如果在計算中第7位與第8位同時產生進位,即所謂雙進位,則這種進位屬于允許的自然丟棄;如果只有第7位或第8位產生進位,即只有單進位,則這種進位屬于溢出。有時候判斷進位也用符號位來判別,即兩個符號相同的數進行加法運算,其結果符號與參加運算的數的符號不同,則產生溢出;兩個不同符號的數進行減法運算,其結果符號與被減數不同,則產生溢出。溢出表示其數值超出計算機字長所能表示的范圍,運算結果必然是錯誤的,因而也是不允許的。通常計算機用溢出標志位來判斷溢出。
當然,溢出主要是指有符號二進制數進行算術運算可能產生的一種現象,對于無符號數來說,第8位不是符號,只有第8位進位才稱為進位,因而不采用溢出這個概念。
【例1.13】X=54,Y=36,求X-Y。

【例1.14】X=88,Y=48,求X+Y。

兩個正數相加,和為負,錯。
溢出判斷可以依據如下方法:溢出=Cs+1⊕Cs(即:結果為0無溢出,結果為1有溢出)。
判斷補碼運算是否產生溢出,也有一種比較簡單的方法。假設參加相加的兩個數及結果都用補碼,且將結果的進位位丟失,則有:
● 兩個正數相加得負數,有正溢出。
● 兩個負數相加得正數,有負溢出。
有三種情況下無溢出:①兩個正數相加得正數;②兩個負數相加得負數;③一個正數與一個負數相加。
1.5.5 常用編碼
1.術語
● 數碼:代表一個確切的數字,如二進制數、八進制數等。
● 代碼:特定的二進制數碼組,是不同信號的代號,不一定有數的意義。
● 編碼:n位二進制數可以組合成2n個不同的信息,給每一個信息規定一個具體碼組,這個過程叫作編碼。
2.二-十進制編碼(BCD碼)
十進制是人們在生活中最習慣的數制,人們通過鍵盤向計算機輸入數據時,常用十進制數輸入,顯示器向人們顯示的數據也多為十進制形式。但計算機能直接識別與處理的卻是二進制數,所以就必須對十進制數進行編碼。二-十進制編碼又稱為BCD(Binary Coded Decimal Code)碼,即用二進制表示十進制。這種編碼的特點是保留十進制的權,數字則用二進制表示。即仍然是逢十進一,但又是一組二進制代碼。常用的8421BCD碼如表1.3所示。
表1.3 常用的BCD碼

例如,十進制數123的BCD碼為0001 0010 0011;十進制數4.56的BCD碼為0100.0101 0110。
BCD碼在單片機應用中十分重要,特別是在數碼顯示中應用很多。
3.二進制碼
● 自然二進制碼:有權碼,每位代碼都有固定權值,結構形式與二進制數完全相同。
● 循環二進制碼:無權碼,每位代碼無固定權值,任何相鄰的兩個碼組中,僅有一個代碼不同。
循環二進制碼又稱格雷碼,屬于可靠性編碼,是一種錯誤最小化的編碼,因為它大大地減少了由一個狀態到下一個狀態時電路中的混淆。由于這種編碼相鄰的兩個碼組之間只有一位不同,因而在用于模/數轉換中,當模擬量發生微小變化而可能引起數字量發生變化時,格雷碼僅改變一位,這樣與其他碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性,這就允許代碼電路能以較少的錯誤在較高的速度下工作。
自然二進制碼和循環二進制碼如表1.4所示。
4.ASCII碼
在計算機中除了數值之外,還有一類非常重要的數據,那就是字符,如英文的大小寫字母(A,B,C,…,a,b,c,…)、數字符號(0,1,2,…,9)以及其他常用符號(如:?、=、%、+等)。在計算機中,這些符號都是用二進制編碼的形式表示。
現在的計算機中字符數據的編碼通常采用的是美國標準信息交換代碼ASCII碼(American Standard Code for Information Interchange)?;続SCII碼標準定義了128個字符。ASCII碼常用于計算機與外部設備的數據傳輸。常用字符的ASCII碼如表1.5所示。
表1.4 兩種4位二進制編碼

表1.5 ASCII碼字符表

在ASCII碼中,前兩列主要是一些操作碼,如NUL表示空格,ACK表示打印校驗等。此外,ASCII碼中包括了數碼(0~9)、英文大寫字母(A~Z)、英文小寫字母(a~z)、特殊符號(!,?,#等)。
在表1.5中,左面和上面為相應字符的ASCII的編碼值,其中上面為高三位二進制碼,左面為低四位二進制碼。例如,字母‘A’用ASCII編碼,其值為1000001,即41H,而符號‘!’的ASCII編碼值為0001010,即0AH。
注意:在ASCII碼中,字母的大、小寫代碼只有b5位有區別,因而要進行大小寫的轉換十分方便,如‘A’的代碼為01000001,而‘a’的代碼則為01100001,在運算中,大寫字母的代碼只需加上32(100000B)就成為小寫字母,而小寫字母減去32就成為大寫字母。
在8位微型計算機中,信息通常是按8位來存儲和傳送的,而ASCII碼共7位,因此,最高位通常定義為0(除非另有規定,如作奇偶校驗位)。如果最高位為1,就不再是ASCII碼了,而可以成為其他代碼,如在漢字系統中,兩個最高位為1的字節組合在一起(16位)就可代表一個漢字。