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