1.2 微型計(jì)算機(jī)運(yùn)算基礎(chǔ)
1.2.1 二進(jìn)制數(shù)的運(yùn)算方法
計(jì)算機(jī)具有強(qiáng)大的運(yùn)算能力,它可以進(jìn)行兩種運(yùn)算:算術(shù)運(yùn)算和邏輯運(yùn)算。
1.二進(jìn)制數(shù)的算術(shù)運(yùn)算
二進(jìn)制數(shù)的算術(shù)運(yùn)算包括:加、減、乘、除四則運(yùn)算,下面分別予以介紹。
(1)二進(jìn)制數(shù)的加法
根據(jù)“逢二進(jìn)一”規(guī)則,二進(jìn)制數(shù)加法的法則如下:
0+0=0
0+1=1+0=1
1+1=0 (進(jìn)位為1)
1+1+1=1 (進(jìn)位為1)
例如,1110和1011相加過(guò)程如下:
(2)二進(jìn)制數(shù)的減法
根據(jù)“借一有二”的規(guī)則,二進(jìn)制數(shù)減法的法則如下:
0-0=0
1-1=0
1-0=1
0-1=1 (借位為1)
例如,1101減去1011的過(guò)程如下:
(3)二進(jìn)制數(shù)的乘法
二進(jìn)制數(shù)乘法過(guò)程可仿照十進(jìn)制數(shù)乘法進(jìn)行。但由于二進(jìn)制數(shù)只有0或1兩種可能的乘數(shù)位,使得二進(jìn)制數(shù)乘法更為簡(jiǎn)單。二進(jìn)制數(shù)乘法的法則如下:
0×0=0
0×1=1×0=0
1×1=1
例如,1001和1010相乘的過(guò)程如下:
由低位到高位,用乘數(shù)的每一位去乘被乘數(shù),若乘數(shù)的某一位為1,則該次部分積為被乘數(shù);若乘數(shù)的某一位為0,則該次部分積為0。某次部分積的最低位必須和本位乘數(shù)對(duì)齊,所有部分積相加的結(jié)果則為相乘得到的乘積。
(4)二進(jìn)制數(shù)的除法
二進(jìn)制數(shù)除法與十進(jìn)制數(shù)除法類(lèi)似。可先從被除數(shù)的最高位開(kāi)始,將被除數(shù)(或中間余數(shù))與除數(shù)相比較,若被除數(shù)(或中間余數(shù))大于除數(shù),則用被除數(shù)(或中間余數(shù))減去除數(shù),商為1,并得到相減之后的中間余數(shù),否則商為0。再將被除數(shù)的下一位移下補(bǔ)充到中間余數(shù)的末位,重復(fù)以上過(guò)程,就可得到所要求的各位商數(shù)和最終的余數(shù)。
例如,100110÷110的過(guò)程如下:
所以,100110÷110=110余10。
2.二進(jìn)制數(shù)的邏輯運(yùn)算
二進(jìn)制數(shù)的邏輯運(yùn)算包括邏輯加法(“或”運(yùn)算)、邏輯乘法(“與”運(yùn)算)、邏輯否定(“非”運(yùn)算)和邏輯“異或”運(yùn)算。
(1)邏輯“或”運(yùn)算
邏輯“或”運(yùn)算又稱(chēng)為邏輯加,可用符號(hào)“+”或“∨”來(lái)表示,規(guī)則如下:
0+0=0或0∨0=0
0+1=1或0∨1=1
1+0=1或1∨0=1
1+1=1或1∨1=1
可見(jiàn),兩個(gè)相“或”的邏輯變量中,只要有一個(gè)為1,“或”運(yùn)算的結(jié)果就為1。僅當(dāng)兩個(gè)變量都為0時(shí),“或”運(yùn)算的結(jié)果才為0。計(jì)算時(shí),要特別注意和算術(shù)運(yùn)算的加法加以區(qū)別。
(2)邏輯“與”運(yùn)算
邏輯“與”運(yùn)算又稱(chēng)為邏輯乘,常用符號(hào)“×”、“·”或“∧”表示,規(guī)則如下:
0×1=0或0·1=0或0∧1=0
1×0=0或1·0=0或1∧0=0
1×1=1或1·1=1或1∧1=1
可見(jiàn),兩個(gè)相“與”的邏輯變量,只要有一個(gè)為0,“與”運(yùn)算的結(jié)果就為0。僅當(dāng)兩個(gè)變量都為1時(shí),“與”運(yùn)算的結(jié)果才為1。
(3)邏輯“非”運(yùn)算
邏輯“非”運(yùn)算又稱(chēng)為邏輯否定,實(shí)際上就是將原邏輯變量的狀態(tài)求反,規(guī)則如下:
可見(jiàn),在變量的上方加一條橫線表示“非”。當(dāng)邏輯變量為0時(shí),“非”運(yùn)算的結(jié)果為1;當(dāng)邏輯變量為1時(shí),“非”運(yùn)算的結(jié)果為0。
(4)邏輯“異或”運(yùn)算
邏輯“異或”運(yùn)算,常用符號(hào)“⊕”或“?”來(lái)表示,規(guī)則如下:
0⊕0=0或0?0=0
0⊕1=1或0?1=1
1⊕0=1或1?0=1
1⊕1=0或1?1=0
可見(jiàn),當(dāng)兩個(gè)相“異或”的邏輯變量取值相同時(shí),“異或”的結(jié)果為0;當(dāng)取值相異時(shí),“異或”的結(jié)果為1。
以上僅就邏輯變量只有1位的情況得到了邏輯“與”、“或”、“非”、“異或”運(yùn)算的運(yùn)算規(guī)則。當(dāng)邏輯變量為多位時(shí),可在兩個(gè)邏輯變量對(duì)應(yīng)位之間按上述規(guī)則進(jìn)行運(yùn)算。特別注意,所有的邏輯運(yùn)算都是按位進(jìn)行的,位與位之間沒(méi)有任何聯(lián)系,即不存在算術(shù)運(yùn)算過(guò)程中的進(jìn)位或借位關(guān)系。下面舉例說(shuō)明。
【例1.1】 兩個(gè)變量的取值為X=00FFH,Y=5555H,分別求Z1=X∧Y,Z2=X∨Y,Z4=X⊕Y的值。
解:X=0000000011111111B
Y=0101010101010101B
則 Z1=0000000001010101B=0055H
Z2=0101010111111111B=55FFH
Z3=1111111100000000B=FF00H
Z4=0101010110101010B=55AAH
計(jì)算機(jī)二進(jìn)制數(shù)算術(shù)運(yùn)算及邏輯運(yùn)算規(guī)則見(jiàn)表1.4。
表1.4 二進(jìn)制數(shù)運(yùn)算規(guī)則一覽表
在計(jì)算機(jī)中需要處理的數(shù)據(jù)包括無(wú)符號(hào)數(shù)和有符號(hào)數(shù)。這些數(shù)在計(jì)算機(jī)中是如何表示的?
1.無(wú)符號(hào)數(shù)
所謂無(wú)符號(hào)數(shù),通常表示一個(gè)數(shù)的絕對(duì)值,即數(shù)的各位都用來(lái)表示數(shù)值的大小。1字節(jié)(8位)二進(jìn)制數(shù)只能表示0~255范圍內(nèi)的數(shù)。因此,要表示大于255的數(shù),必須采用多字節(jié)來(lái)表示,它的長(zhǎng)度可以為任意倍字節(jié)長(zhǎng),其數(shù)據(jù)格式如圖1.1所示。
2.有符號(hào)數(shù)
所謂有符號(hào)數(shù),即用來(lái)表示一個(gè)任意位長(zhǎng)的正數(shù)或負(fù)數(shù)。我們知道,在普通數(shù)字中,區(qū)分正負(fù)數(shù)是通過(guò)在數(shù)的絕對(duì)值前面加上符號(hào)來(lái)表示的,即“+”表示正數(shù),“-”表示負(fù)數(shù)。在計(jì)算機(jī)中,數(shù)的符號(hào)也數(shù)碼化了,一般用一個(gè)數(shù)的最高位作為符號(hào)位,用“0”表示正號(hào),用“1”表示負(fù)號(hào),而其余位為數(shù)值位。其數(shù)據(jù)格式如圖1.2所示。
3.有符號(hào)數(shù)的原碼、反碼、補(bǔ)碼及補(bǔ)碼運(yùn)算
帶正、負(fù)號(hào)的二進(jìn)制數(shù)稱(chēng)為數(shù)的真值表示。
例如:X=+1010110B,Y=-0110101B
為了運(yùn)算方便,計(jì)算機(jī)中的有符號(hào)數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼,稱(chēng)為機(jī)器數(shù)。
(1)原碼
正數(shù)的符號(hào)位用“0”表示,負(fù)數(shù)的符號(hào)位用“1”表示,其余數(shù)字位表示數(shù)值本身,這種表示法稱(chēng)為原碼。
前例X、Y可表示為:
[X]原=01010110B,[Y]原=10110101B
對(duì)于0,可以認(rèn)為它是+0,也可以認(rèn)為它是-0。因此在原碼中,0有下列兩種表示:
[+0]原=00000000B,[-0]原=10000000B
原碼表示數(shù)的方法很簡(jiǎn)單,只需要在真值的基礎(chǔ)上,將符號(hào)位用數(shù)碼“0”和“1”表示即可。但采用原碼表示的數(shù)在計(jì)算機(jī)中進(jìn)行加、減運(yùn)算時(shí)很麻煩。例如:遇到兩個(gè)異號(hào)數(shù)相加或兩個(gè)同號(hào)數(shù)相減時(shí),就要用減法運(yùn)算。為了把減法運(yùn)算轉(zhuǎn)變成加法運(yùn)算,引入了反碼和補(bǔ)碼。
(2)反碼
在原碼表示的基礎(chǔ)上很容易求得一個(gè)數(shù)的反碼。正數(shù)的反碼與原碼相同,而負(fù)數(shù)的反碼則是在原碼的基礎(chǔ)上,符號(hào)位不變(仍為1),其余數(shù)位按位求反,即0→1,1→0。
前例X、Y可表示為:
[X]反=01010110B,[Y]反=11001010B
而 [+0]反=00000000B,[-0]反=11111111B
(3)補(bǔ)碼
一個(gè)數(shù)的補(bǔ)碼也很容易求得。如果是正數(shù),補(bǔ)碼同原碼也同反碼,如果是負(fù)數(shù),則在反碼的基礎(chǔ)上最末位加1。
前例X、Y可表示為:
[X]補(bǔ)=01010110B=[X]反=[X]原,[Y]補(bǔ)=11001011B
注:補(bǔ)碼中0只有一種表示,無(wú)正負(fù)之分,即
[+0]補(bǔ)=[-0]補(bǔ)=00000000B
不難證明,補(bǔ)碼具有如下特性:
[[X]補(bǔ)]補(bǔ)=[X]原
用8位二進(jìn)制數(shù)來(lái)表示無(wú)符號(hào)數(shù)及有符號(hào)數(shù)的原碼、反碼、補(bǔ)碼時(shí)的對(duì)應(yīng)關(guān)系見(jiàn)表1.5。
表1.5 用8位二進(jìn)制數(shù)來(lái)表示無(wú)符號(hào)數(shù)及有符號(hào)數(shù)的原碼、反碼、補(bǔ)碼時(shí)的對(duì)應(yīng)關(guān)系
(4)補(bǔ)碼運(yùn)算
兩個(gè)用補(bǔ)碼表示的有符號(hào)數(shù)進(jìn)行加、減運(yùn)算時(shí),其特點(diǎn)是把符號(hào)位上表示正、負(fù)的“0”和“1”也看成數(shù),與數(shù)值部分一同進(jìn)行運(yùn)算,所得的結(jié)果也為補(bǔ)碼形式。即結(jié)果的符號(hào)位為“0”,表示正數(shù);結(jié)果的符號(hào)位為“1”,表示負(fù)數(shù)。下面分加、減兩種情況予以討論。
兩個(gè)有符號(hào)數(shù)X和Y進(jìn)行相加時(shí),先將兩個(gè)數(shù)分別轉(zhuǎn)換為補(bǔ)碼的形式,然后進(jìn)行補(bǔ)碼加運(yùn)算,所得的結(jié)果為和的補(bǔ)碼形式,即:
[X+Y]補(bǔ)=[X]補(bǔ)+[Y]補(bǔ)
【例1.2】 用補(bǔ)碼進(jìn)行下列運(yùn)算:
① (+18)+(-15);②(-18)+(+15);③(-18)+(-11)。
解:
由例1.2可知,當(dāng)帶符號(hào)的數(shù)采用補(bǔ)碼形式進(jìn)行相加運(yùn)算時(shí),可把符號(hào)位也當(dāng)作普通數(shù)字一樣與數(shù)值部分一起進(jìn)行加法運(yùn)算。若符號(hào)位上產(chǎn)生進(jìn)位時(shí),則自動(dòng)丟掉,所得的結(jié)果為兩數(shù)之和的補(bǔ)碼形式。如果想得到運(yùn)算后原碼的結(jié)果,可對(duì)運(yùn)算結(jié)果再求一次補(bǔ)碼即可。
兩個(gè)有符號(hào)數(shù)相減,可通過(guò)下面的公式進(jìn)行:
X-Y=X+(-Y)
則 [X-Y]補(bǔ)=[X+(-Y)]補(bǔ)=[X]補(bǔ)+[-Y]補(bǔ)
可見(jiàn),求[X-Y]補(bǔ),可以用[X]補(bǔ)和[-Y]補(bǔ)相加來(lái)實(shí)現(xiàn)。這里關(guān)鍵在于求[-Y]補(bǔ)。如果已知[Y]補(bǔ),那么對(duì)[Y]補(bǔ)的每位(包括符號(hào)位)都按位求反,然后末位加1,結(jié)果即為[-Y]補(bǔ)(證明略)。一般稱(chēng)[-Y]補(bǔ)為對(duì)[Y]補(bǔ)的“變補(bǔ)”,即[[Y]補(bǔ)]變補(bǔ)=[-Y]補(bǔ);已知[Y]補(bǔ)求[-Y]補(bǔ)的過(guò)程稱(chēng)為變補(bǔ)。
這樣,求兩個(gè)帶符號(hào)的二進(jìn)制數(shù)之差,可以用“減數(shù)(補(bǔ)碼)變補(bǔ)與被減數(shù)(補(bǔ)碼)相加”來(lái)實(shí)現(xiàn)。這是補(bǔ)碼表示法的主要優(yōu)點(diǎn)之一。
【例1.3】 用補(bǔ)碼進(jìn)行下列運(yùn)算:
① 96-19; ② (-56)-(-17)。
解:① X=96,Y=19,則
[X]補(bǔ)=01100000
[Y]補(bǔ)=00010011
[-Y]補(bǔ)=11101101
故 [X-Y]補(bǔ)=[X-Y]原=01001101=+77
② X=-56,Y=-17,則
[X]補(bǔ)=11001000
[Y]補(bǔ)=11101111
[-Y]=00010001補(bǔ)
則 [X-Y]補(bǔ)=11011001
故 [X-Y]原=[[X-Y]補(bǔ)]補(bǔ)=10100111=-39
綜上所述,對(duì)于補(bǔ)碼的加、減運(yùn)算可用下邊一般公式表示:
[X±Y]補(bǔ)=[X]補(bǔ)+[±Y]補(bǔ)(|X|,|Y|及|X±Y都小于2n+1)
(5)溢出判斷
當(dāng)兩個(gè)有符號(hào)數(shù)進(jìn)行補(bǔ)碼運(yùn)算時(shí),若運(yùn)算結(jié)果的絕對(duì)值超出運(yùn)算裝置容量,數(shù)值部分就會(huì)發(fā)生溢出,占據(jù)符號(hào)位的位置,導(dǎo)致錯(cuò)誤的結(jié)果。這種現(xiàn)象通常稱(chēng)為補(bǔ)碼溢出,簡(jiǎn)稱(chēng)溢出。這和正常運(yùn)算時(shí)符號(hào)位的進(jìn)位自動(dòng)丟失在性質(zhì)上是不同的。下面舉例說(shuō)明。
【例如1.4】 某運(yùn)算裝置共有5位,除最高位表示符號(hào)位外,還有4位用來(lái)表示數(shù)值。先看下面兩組運(yùn)算。
① 計(jì)算13+7=?
② 計(jì)算(-4)+(-4)=?
① 數(shù)的運(yùn)算結(jié)果顯然是錯(cuò)誤的,因?yàn)閮蓚€(gè)正數(shù)相加不可能得到負(fù)數(shù)的結(jié)果,產(chǎn)生錯(cuò)誤的原因是由于兩個(gè)數(shù)相加后的數(shù)值超出了加法裝置所允許位數(shù)(數(shù)值部分4位),因而從數(shù)值的最高位向符號(hào)位產(chǎn)生了進(jìn)位,或者說(shuō)這種現(xiàn)象是由于“溢出”而造成的。②的結(jié)果顯然是正確的,由符號(hào)位產(chǎn)生的進(jìn)位自動(dòng)丟失。
為了保證運(yùn)算結(jié)果的正確性,計(jì)算機(jī)必須能夠判別出是正常進(jìn)位還是發(fā)生了溢出錯(cuò)誤。計(jì)算機(jī)中常用的溢出判別稱(chēng)為雙高位判別法,并常用“異或”電路來(lái)實(shí)現(xiàn)溢出判別。其表達(dá)式為:
CS⊕CP=1(表示發(fā)生了溢出錯(cuò)誤)
式中,
CS——最高位(符號(hào)位)產(chǎn)生進(jìn)位的情況。CS=1,有進(jìn)位;CS=0,無(wú)進(jìn)位。
CP——次高位(數(shù)值部分最高位)向符號(hào)位產(chǎn)生進(jìn)位的情況。CP=1,有進(jìn)位;CP=0,無(wú)進(jìn)位。
由表達(dá)式可知,在運(yùn)算結(jié)果中,當(dāng)CS和CP狀態(tài)不同(為01或10)時(shí),產(chǎn)生溢出;在運(yùn)算結(jié)果中,當(dāng)CS和CP狀態(tài)相同(為00或11)時(shí),不產(chǎn)生溢出。
發(fā)生溢出時(shí),CSCP=01為正溢出,通常出現(xiàn)在兩個(gè)正數(shù)相加時(shí);CSCP=10為負(fù)溢出,通常出現(xiàn)在兩個(gè)負(fù)數(shù)相加時(shí)。考察上面的兩例。當(dāng)CS⊕CP=0⊕1=1時(shí),有溢出,為正溢出。當(dāng)CS⊕CP=1⊕1=0時(shí),無(wú)溢出,從而可知,一個(gè)正數(shù)和一個(gè)負(fù)數(shù)相加時(shí),它們的和肯定不會(huì)發(fā)生溢出。下面舉例說(shuō)明溢出判別。
【例1.5】 計(jì)算64+65=?
由于CS⊕CP=0⊕1=1產(chǎn)生溢出,并且是正溢出,導(dǎo)致運(yùn)算結(jié)果出錯(cuò)。
【例1.6】 計(jì)算-110-92=?
由于CS⊕CP=1⊕0=1,產(chǎn)生溢出,并且是負(fù)溢出,結(jié)果出錯(cuò)。
【例1.7】 計(jì)算-117+121=?
一個(gè)負(fù)數(shù)和一個(gè)正數(shù)相加,結(jié)果不溢出。此時(shí),CS⊕CP=1⊕1=0。
1.2.3 數(shù)的編碼方法
在計(jì)算機(jī)中,所有用到的數(shù)字、字母、符號(hào)、指令等都必須用特定的二進(jìn)制碼來(lái)表示,這就是二進(jìn)制編碼。
1.二進(jìn)制編碼的十進(jìn)制數(shù)
計(jì)算機(jī)只能識(shí)別二進(jìn)制數(shù),但人們熟悉的卻是十進(jìn)制數(shù)。所以在計(jì)算機(jī)輸入和輸出數(shù)據(jù)時(shí),往往采用十進(jìn)制數(shù)表示。不過(guò),這樣的十進(jìn)制數(shù)是用二進(jìn)制編碼表示的,稱(chēng)為二進(jìn)制編碼的十進(jìn)制數(shù)——BCD(binary code decimal)碼。
用二進(jìn)制數(shù)為十進(jìn)制數(shù)編碼,每位十進(jìn)制數(shù)需要用4位二進(jìn)制數(shù)來(lái)表示。4位二進(jìn)制數(shù)共有16種編碼形式,由于十進(jìn)制數(shù)只有0~9共10個(gè)數(shù)碼,故有6個(gè)編碼是多余的,放棄不用。而這種多余性便產(chǎn)生了多種不同的BCD碼。在計(jì)算機(jī)中較常用的是8421 BCD碼(在以后的章節(jié)中簡(jiǎn)稱(chēng)為BCD碼)。這種BCD碼用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)的數(shù)碼0~9,權(quán)值從高位到低位依次為8,4,2,1。BCD編碼見(jiàn)表1.6。
表1.6 8421 BCD碼編碼表
(1001000101110101)8421 BCD=(9175)10
2.字母與符號(hào)的編碼
在計(jì)算機(jī)中,字母和符號(hào)也必須用特定的二進(jìn)制編碼來(lái)表示。目前,在計(jì)算機(jī)、通信設(shè)備及儀器儀表中廣泛采用的是美國(guó)標(biāo)準(zhǔn)信息交換碼(ASCII,American standard code for information interchange)。它用7位二進(jìn)制編碼表示一個(gè)字母或符號(hào),共能表示27=128個(gè)不同的字符。其中包括數(shù)字0~9、英文大寫(xiě)字母、英文小寫(xiě)字母、運(yùn)算符、標(biāo)點(diǎn)及其他的一些控制符號(hào)。常用的7位ASCII碼見(jiàn)表1.7。
表1.7 美國(guó)標(biāo)準(zhǔn)信息交換碼ASCII編碼
數(shù)字9的ASCII碼為0111001B或39H,
字母A的ASCII碼為1000001B或41H。
ASCII編碼多用于微型計(jì)算機(jī)的輸入/輸出設(shè)備(如電傳打字機(jī))及在數(shù)據(jù)傳送過(guò)程中進(jìn)行奇偶校驗(yàn)。