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