什么是微型計算機(jī)的數(shù)制和編碼
在微型計算機(jī)中,所有信息(如數(shù)值、符號和圖像等)均以二進(jìn)制形式存儲、傳輸和計算。由于二進(jìn)制數(shù)冗長、不方便讀寫和辨認(rèn),因此,現(xiàn)代微型計算機(jī)也支持編程時使用書寫長度更短的十六進(jìn)制數(shù)和十進(jìn)制數(shù),同時也為各種非數(shù)值信息提供了相應(yīng)的數(shù)值編碼(即用數(shù)值表示非數(shù)值信息)方法。
數(shù)制
計算機(jī)應(yīng)用中,最常用的數(shù)制有二進(jìn)制(Binary)、十六進(jìn)制(Hexadecimal)和十進(jìn)制(Decimal)。本文將介紹這三種進(jìn)制的數(shù)值表示方法,以及它們之間的轉(zhuǎn)換方法。
1.進(jìn)制數(shù)的表示和計算
二進(jìn)制數(shù)由數(shù)字0和1表示,十進(jìn)制數(shù)由數(shù)字0~9表示,而十六進(jìn)制數(shù)則由數(shù)字0~9以及大寫或小寫的英文字母A、B、C、D、E和F表示。表1-1給出了部分二進(jìn)制數(shù)、十進(jìn)制數(shù)和十六進(jìn)制數(shù)之間的對應(yīng)關(guān)系。
數(shù)值通常以其數(shù)制的英文名稱的開頭字母(大、小寫均可)為后綴,例如:10B、7FH和39D分別為二進(jìn)制、十六進(jìn)制和十進(jìn)制數(shù)。十進(jìn)制數(shù)的后綴字母D可以省略。進(jìn)行加法計算時,二進(jìn)制數(shù)、十進(jìn)制數(shù)和十六進(jìn)制數(shù)分別遵循“逢二進(jìn)一”“逢十進(jìn)一”和“逢十六進(jìn)一”的原則。例如:1B+01B=10B;09D+1D=10D;09H+1H=0AH。
2.進(jìn)制的轉(zhuǎn)換
任意一個數(shù)an?1an?2…a0.a?1a?2…a?m,無論其以何種進(jìn)制表示,都可以按照下式轉(zhuǎn)換成對應(yīng)的十進(jìn)制數(shù)N:
式中,b為基數(shù),二進(jìn)制數(shù)、十進(jìn)制數(shù)和十六進(jìn)制數(shù)的基數(shù)分別為2、10和16;ai為數(shù)的第i位,是在0~(b-1)范圍內(nèi)的自然數(shù);bi為該數(shù)第i位的權(quán)值;n和m分別為該數(shù)整數(shù)部分和
小數(shù)部分的位數(shù)。可見,將任意進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)是一個加權(quán)求和的過程。例如,十六進(jìn)制數(shù)0FAH=(0FH×161+0AH×160)=(15×16+10×1)=250D=250。
二進(jìn)制數(shù)、十六進(jìn)制數(shù)和十進(jìn)制數(shù)之間的轉(zhuǎn)換方法如圖1-10所示。將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)和十六進(jìn)制數(shù)時,應(yīng)重復(fù)進(jìn)行除法,直到余數(shù)為0為止,并且各次除法所得的余數(shù)中,最先得到和最后得到的余數(shù)分別為轉(zhuǎn)換結(jié)果的最低位和最高位,其他依此類推。
圖1-10進(jìn)制轉(zhuǎn)換方法示意圖
數(shù)據(jù)在計算機(jī)中的表示
數(shù)據(jù)可以分為無符號數(shù)和有符號數(shù)兩類,其中無符號數(shù)的所有二進(jìn)制位都是數(shù)值位,處理起來比較簡單;而有符號數(shù)有正負(fù)之分,在計算機(jī)中表示和處理起來相對復(fù)雜。本節(jié)重點介紹幾種常用有符號數(shù)的表達(dá)方式。
1.真值和機(jī)器數(shù)
計算機(jī)只能以二進(jìn)制形式處理數(shù)據(jù),包括代表數(shù)值正或負(fù)的符號“+”和“-”也只能用二進(jìn)制數(shù)表示。在現(xiàn)代計算機(jī)中,通常將二進(jìn)制數(shù)的最高位作為符號位以表示數(shù)的正負(fù),該位為0代表正號,為1代表負(fù)號。這種將符號進(jìn)行數(shù)值化表示的數(shù)被稱為機(jī)器數(shù),而其對應(yīng)的原始數(shù)據(jù)被稱為真值。
2.原碼
原碼就是機(jī)器數(shù)。通常用[X]原表示數(shù)據(jù)X的原碼。例如,真值+18和-18所對應(yīng)的8位機(jī)器數(shù)分別是[+18]原=00010010B和[-18]原=10010010B。另外計算機(jī)中存在+0和-0,[+0]原=00000000B、[-0]原=10000000B。
需要注意,在計算機(jī)中,數(shù)據(jù)所含二進(jìn)制位的個數(shù)是有限的,受到CPU字長的限制。因此,將真值轉(zhuǎn)換成機(jī)器數(shù)時,必須預(yù)先明確機(jī)器數(shù)的位數(shù)。這一點,在處理反碼和補(bǔ)碼時也同樣要注意到。
在本書后面的章節(jié)中,若不做特別聲明,則默認(rèn)CPU的字長和數(shù)據(jù)的位數(shù)均為8位。
3.反碼
正數(shù)的反碼和原碼相同。負(fù)數(shù)反碼的最高位(即符號位)為1,其余位各位為原碼各位按位取反。數(shù)據(jù)X的反碼用[X]反表示。例如:[+18]反=00010010B;[-18]反=11101101B。+0和-0的反碼不同,[+0]反=00000000B、[-0]反=11111111B。
4.補(bǔ)碼
正數(shù)的補(bǔ)碼與原碼相同,通過以下兩種方法可以得到負(fù)數(shù)X的補(bǔ)碼:
1)[X]補(bǔ)=[X]反+1。
2)[X]補(bǔ)=2n+X。其中,n是二進(jìn)制數(shù)的位數(shù);2n為n位二進(jìn)制數(shù)的“?!?可以理解為n位二進(jìn)制數(shù)所能表示的不同的數(shù)的個數(shù))。
對一個字長為n的CPU,若X>0,則(2n+X)的結(jié)果是X。因為,字長為n的CPU只能完成n位二進(jìn)制運(yùn)算。當(dāng)加法結(jié)果大于模2n時,將產(chǎn)生進(jìn)位,使得運(yùn)算結(jié)果中超出模的部分被舍棄掉,而被舍棄掉的部分的數(shù)值大小為2n,進(jìn)一步可知,對于任意整數(shù)m,(2n+m×X)的結(jié)果也是X。在數(shù)學(xué)上,這種情況被稱為“同余”,即兩個整數(shù)a和b除以同一個整數(shù)K后所得的余數(shù)相同,被稱為a和b對于模K“同余”,記作:a(mod K)=b(mod K)。對于n位的CPU來說,在進(jìn)行加減計算時,對于模2n同余的兩個數(shù)之間并沒有差別。
另外,設(shè)X和Y為整數(shù),則補(bǔ)碼還有以下運(yùn)算規(guī)則:
1){[X]補(bǔ)}補(bǔ)=[X]原
2)[X+Y]補(bǔ)=2n+(X+Y)=2n+2n+(X+Y)=(2n+X)+(2n+Y)=[X]補(bǔ)+[Y]補(bǔ)
3)[X-Y]補(bǔ)=2n+(X-Y)=2n+2n+(X-Y)=(2n+X)+[2n+(-Y)]=[X]補(bǔ)+[-Y]補(bǔ)
若補(bǔ)碼為8位二進(jìn)制數(shù),則[-18]補(bǔ)=28+X=256-18=238=11101110B。另外,也可以計算正
數(shù)的補(bǔ)碼。例如:+18的8位二進(jìn)制補(bǔ)碼為[+18]補(bǔ)=28+18=18(mod 256)=18,需要說明的是,該計算過程的最后一個等號是成立的,因為8位二進(jìn)制數(shù)計算過程中,第7位(最高位)的進(jìn)位無法保存將被舍棄掉。
另外,根據(jù)補(bǔ)碼的計算方法可知,+0和-0的補(bǔ)碼相同,[-0]補(bǔ)=[+0]補(bǔ)=00000000B。
在現(xiàn)代微型計算機(jī)中,有符號數(shù)會自動被計算機(jī)轉(zhuǎn)換成補(bǔ)碼,并以補(bǔ)碼的形式存放和參與計算。在補(bǔ)碼計算過程中,符號位也參與計算,即便如此,也能得到正確的計算結(jié)果,并且引入補(bǔ)碼后,可以將減法運(yùn)算轉(zhuǎn)換為補(bǔ)碼的加法運(yùn)算。
常用編碼
在計算機(jī)中,常用的編碼有BCD碼和ASCII碼。
1.BCD碼
BCD碼的英文表達(dá)為Binary Coded Decimal。顧名思義,BCD碼是用二進(jìn)制編碼的十進(jìn)制數(shù),只能由0~9的數(shù)字構(gòu)成,并且按照十進(jìn)制的“逢十進(jìn)一”法則進(jìn)行運(yùn)算。BCD碼又分為壓縮BCD碼和非壓縮BCD碼兩種,其中:壓縮BCD碼用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù);而非壓縮BCD碼用8位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)。另外,因為按照表1-1可以方便地進(jìn)行4位二進(jìn)制數(shù)與1位十六進(jìn)制數(shù)的轉(zhuǎn)換,并且與二進(jìn)制數(shù)相比,十六進(jìn)制數(shù)更易于書寫和記憶,所以,在實際應(yīng)用中通常將BCD碼表示為十六進(jìn)制數(shù)。
2.ASCII碼
除了數(shù)值信息外,計算機(jī)還需處理字符、按鍵等非數(shù)值信息。而這些非數(shù)值信息也必須以二進(jìn)制數(shù)的方式進(jìn)行編碼處理。ASCII碼是美國信息交換標(biāo)準(zhǔn)代碼(American Standard Code for Information Interchange)的簡稱,是一種應(yīng)用廣泛的編碼方法。
每個ASCII編碼均由7位二進(jìn)制數(shù)構(gòu)成,ASCII碼表包含128個字符的ASCII碼。這些字符可以分成兩類,包括:①圖形字符,這類字符可以打印和顯示,如鍵盤上的英文字母“A”“B”和標(biāo)點符號“,”“?!钡?②控制類字符,這類字符不能被打印和顯示,主要用于計算機(jī)的控制操作,如PC鍵盤上的鍵和鍵等。