[摘 要]為了對數(shù)據(jù)進(jìn)行處理,首先要把數(shù)據(jù)表示出來,計(jì)算機(jī)中采用機(jī)器碼表示數(shù)值型數(shù)據(jù)。首先從原碼出發(fā),分析了計(jì)算過程中出現(xiàn)的問題,引出補(bǔ)碼,并深入剖析了補(bǔ)碼的定義。在計(jì)算補(bǔ)碼的過程中又引出反碼。清晰地展示了三種機(jī)器碼之間的內(nèi)在關(guān)系,對機(jī)器碼概念的理解有一定的幫助。
[關(guān)鍵詞]原碼 補(bǔ)碼 反碼 模
[中圖分類號(hào)] G623.58 [文獻(xiàn)標(biāo)識(shí)碼] A [文章編號(hào)] 2095-3437(2012)05-0127-02
一、引言
計(jì)算機(jī)可以看做是一個(gè)數(shù)據(jù)處理機(jī),這里的數(shù)據(jù)含義很廣,既包括數(shù)值型數(shù)據(jù),也包括諸如漢字、圖形、符號(hào)、聲音等等非數(shù)值型的數(shù)據(jù),既然要對這些數(shù)據(jù)進(jìn)行處理,那么,首先,必須要把這些數(shù)據(jù)表示出來。這里介紹數(shù)值型數(shù)據(jù)在計(jì)算機(jī)當(dāng)中的表示方法,也稱為機(jī)器碼。
二、三種機(jī)器碼
說到數(shù)值型數(shù)據(jù),我們自然會(huì)想到,有正數(shù)和負(fù)數(shù)之分,比如:+1001, -1100,既然計(jì)算機(jī)采用的是二進(jìn)制,
也就是只有0和1兩種狀態(tài),那么,正號(hào)和負(fù)號(hào)在計(jì)算機(jī)當(dāng)中如何來表示呢?很顯然,有兩種解決的方法,第一:用0表示正數(shù),我們把+1001可寫為01001,用1來表示負(fù)數(shù),把-1100可寫為11100。第二種方法:用1來表示正號(hào)而用0來表示負(fù)號(hào)。當(dāng)把符號(hào)用0和1表示出來之后,也稱為把符號(hào)數(shù)字化之后,還有一個(gè)問題,如果要進(jìn)行加、減、乘除等等運(yùn)算,那么符號(hào)位是否參與運(yùn)算?如果參與運(yùn)算,會(huì)有什么樣的結(jié)果?為了能夠妥善的解決這一系列的問題,就產(chǎn)生了把符號(hào)位和數(shù)值位一起編碼的很多種表示方法,分別為:原碼、補(bǔ)碼、反碼和移碼。
同時(shí),為了能夠區(qū)別我們平常書寫的帶有正負(fù)號(hào)的數(shù)和符號(hào)數(shù)字化的數(shù),我們把前者(即帶有正負(fù)號(hào)的數(shù))稱為真值,用x表示;后者(符號(hào)數(shù)字化之后的數(shù))稱為機(jī)器碼,用[x]原來表示(或[x]補(bǔ),[x]反)。為方便描述,下面我們僅以整數(shù)為例。
(一)原碼
整數(shù)原碼的定義如下:
[x]原=0,x 2n>x≥02n+x 0≥x>-2n (1)
其中,x為真值,n為整數(shù)的位數(shù)。
原碼是非常簡單的一種編碼方法,它由兩部分構(gòu)成,符號(hào)位和數(shù)值位。如果是正數(shù),符號(hào)位用0來表示,如果是負(fù)數(shù),符號(hào)位用1來表示;數(shù)值部分均為真值x的絕對值。
定義的理解:觀察公式(1),正數(shù)原碼的定義很好理解;負(fù)數(shù)原碼的定義如何理解呢?不難發(fā)現(xiàn),2n用二進(jìn)制來表示,其形式為:
在此基礎(chǔ)上,加上n位數(shù)的絕對值即得原碼,這與上面的描述(符號(hào)位用1來表示,數(shù)值部分是真值x的絕對值)相吻合。
原碼雖然簡單直觀,但用原碼做加法時(shí),會(huì)出現(xiàn)如下問題:
從表1中可以看出,如果一個(gè)正數(shù)和一個(gè)負(fù)數(shù)做加法,事實(shí)上,我們會(huì)比較這2個(gè)數(shù)絕對值的大小,然后用絕對值大的數(shù)減去絕對值小的數(shù),符號(hào)選擇絕對值大的數(shù)的符號(hào)。也就是說,實(shí)際上,我們做的是減法運(yùn)算。那么,能否只做加法運(yùn)算呢,如果可以把減法運(yùn)算都化為加法運(yùn)算,只設(shè)計(jì)加法器就足夠了?;卮鹗强隙ǖ模@要借助補(bǔ)碼來實(shí)現(xiàn)。
(二)補(bǔ)碼
介紹補(bǔ)碼之前,必須先介紹模的概念。
什么是模呢?可以把模理解為一個(gè)容器的容量。比如:我們最常見到的時(shí)鐘,它的容量是12,其模也就是12。利用模的概念可以幫助我們理解很多實(shí)際問題。
比如:時(shí)鐘的時(shí)針目前指向6點(diǎn)的位置,要使其指向3點(diǎn),共有2種方法,順時(shí)針撥9格(+9),或逆時(shí)針撥3格(-3)。這里,+9和-3具有同樣的實(shí)際意義。順時(shí)針我們做的是加法運(yùn)算:6+9=15,因?yàn)闀r(shí)鐘的模是12,達(dá)到模的部分會(huì)自動(dòng)丟失,也就是15-12=3,即3點(diǎn)。逆時(shí)針我們做的是減法運(yùn)算:6-3=3。不難看出,在這個(gè)例子當(dāng)中,-3和+9是完全等價(jià)的。負(fù)數(shù)-3用正數(shù)+9可以代替,這樣就可以化減法運(yùn)算為加法運(yùn)算了。這里,+9就是-3的補(bǔ)碼(模為12的情況下)。
通過剛才的實(shí)例,得出一個(gè)結(jié)論:如果運(yùn)算是有模的運(yùn)算,負(fù)數(shù)用它的補(bǔ)碼代替,就可以劃減為加。那么如何求得其補(bǔ)碼呢?通過觀察發(fā)現(xiàn):負(fù)數(shù)加上模即可得到補(bǔ)碼。
在計(jì)算機(jī)中,如果能夠效仿這種方法,同樣可以化減為加。那么計(jì)算機(jī)當(dāng)中的運(yùn)算是有模的運(yùn)算嗎?是。因?yàn)樵谟?jì)算機(jī)中,數(shù)據(jù)是放在寄存器當(dāng)中的,而寄存器的位數(shù)是固定的。例如:1個(gè)4位二進(jìn)制計(jì)數(shù)器,當(dāng)計(jì)數(shù)器從0變到15之后,再加1,計(jì)數(shù)器又變?yōu)?,也就是說這個(gè)計(jì)數(shù)器的容量是16,其模為2n=16。同理,n+1位的寄存器,模為2n+1。那么,n位的整數(shù),計(jì)算其補(bǔ)碼時(shí),模是多少呢?為了在以后的運(yùn)算過程中,符號(hào)位也能參與運(yùn)算,我們連同符號(hào)位考慮在內(nèi),也就是說,n位的整數(shù),放在n+1位的寄存器當(dāng)中,模應(yīng)該選擇2n+1,如表2所示:
這樣,得出補(bǔ)碼的定義如下:
[x]補(bǔ)=0,x 2n>x≥02n+1+x 0>x>-2n(mod2n+1) (2)
其中,x為真值,n為整數(shù)的位數(shù)
注:正數(shù)的補(bǔ)碼就是其原碼,因?yàn)樵谶\(yùn)算過程中,它不需要被替換。
下面,舉例說明負(fù)數(shù)補(bǔ)碼的計(jì)算。
例:x=-1010
引入補(bǔ)碼的目的是為了化減為加,可是,在計(jì)算補(bǔ)碼的過程中,又出現(xiàn)了減法運(yùn)算,我們改進(jìn)一下計(jì)算補(bǔ)碼的過程:
通過觀察發(fā)現(xiàn):這兩個(gè)數(shù)符號(hào)位相同,數(shù)值位相反,這就是“原碼”與“反碼”的關(guān)系,由此可見,為了更加便捷地計(jì)算補(bǔ)碼,引入了“反碼”。那“反碼”如何定義呢?很明顯,反碼加1得到補(bǔ)碼,補(bǔ)碼減1就是反碼了。
(三)反碼
為了更方便地計(jì)算負(fù)數(shù)的補(bǔ)碼,引入了“反碼”,其定義為:
[x]反=0,x 2n>x≥0(2n+1-1)+x 0≥x>-2n(mod2n+1-1) (3)
其中,x為真值,n為整數(shù)的位數(shù)
四、總結(jié)
詳細(xì)介紹了3種機(jī)器碼的表示方法:從原碼的定義出發(fā),分析了原碼做加減法存在的問題,引出補(bǔ)碼,并對補(bǔ)碼的定義進(jìn)行了深入的分析。為了簡化補(bǔ)碼的計(jì)算引出反碼。清晰地展示了三種編碼之間的關(guān)系。
[ 參 考 文 獻(xiàn) ]
[1] 唐朔飛.計(jì)算機(jī)組成原理(第2版)[M].北京:高等教育出版社,2008.
[2] 白中英.計(jì)算機(jī)組成原理(第四版)[M].北京:科學(xué)出版社,2008.
[3] 王誠. 計(jì)算機(jī)組成原理(第3版)[M].北京:清華大學(xué)出版社,2004.
[4] 蔣本珊. 計(jì)算機(jī)組成原理(第2版)[M].北京:清華大學(xué)出版社,2008.
[責(zé)任編輯:左 蕓]