武濤+智洋+白麗珍
[摘 要]在計算機系統(tǒng)中,數(shù)值型數(shù)據(jù)采用機器碼來表示,掌握不同機器碼之間的內(nèi)在聯(lián)系,可以幫助學(xué)生深入理解補碼的概念,該文從原碼的定義出發(fā),逐步引入補碼,并闡釋了補碼定義過程中,選取模的方法;又從補碼的計算引出反碼。完整地表明了原碼補碼反碼之間的內(nèi)在聯(lián)系。對機器碼的理解具有一定的指導(dǎo)意義。
[關(guān)鍵詞]機器碼;原碼;補碼;反碼;模
[中圖分類號] TP3 [文獻標(biāo)識碼] A [文章編號] 2095-3437(2017)04-0018-03
計算機(computer),即電腦,是能夠按照程序自動運行并快速處理大量數(shù)據(jù)的電子設(shè)備。它既可以進行數(shù)值計算,又可以進行邏輯計算,還具有存儲記憶的功能。
從某種意思上來說,這就是一個數(shù)據(jù)處理機,這里的數(shù)據(jù)是一個含義很廣的概念,有數(shù)值型數(shù)據(jù),也就是我們熟知的那些能進行加減乘除運算的數(shù)值,還有非數(shù)值型的數(shù)據(jù),也就是不能進行加減乘除運算的其他一切。那么計算機如何處理這些數(shù)據(jù)呢?首先必須要把這些數(shù)據(jù)存儲在計算機內(nèi),下面描述數(shù)值型數(shù)據(jù)的存儲方法。
一、機器碼
結(jié)合計算機的特點來進行分析,為了電路實現(xiàn)方便以及容易區(qū)分和存儲等特點,計算機內(nèi)部使用二進制存儲數(shù)據(jù)。進制之間的轉(zhuǎn)換是非常容易的,但這遠(yuǎn)遠(yuǎn)不能解決數(shù)值的存儲問題。正數(shù)與負(fù)數(shù)如何區(qū)分呢?加一個符號位來標(biāo)識正數(shù)與負(fù)數(shù)即可。由此容易聯(lián)想到,既然計算機采用二進制,那么0和1就可以代表不同的狀態(tài)。我們可以用0和1這兩種不同的狀態(tài)對應(yīng)正數(shù)負(fù)數(shù)兩種不同的狀態(tài)。那么如何對應(yīng)? 用0表示正數(shù),還是1表示正數(shù)?怎么樣建立其對應(yīng)關(guān)系,而且能保證在進行加減乘除運算時方便快捷不出錯呢?由此,出現(xiàn)了很多種表示數(shù)值型數(shù)據(jù)的方法。這種把符號位和數(shù)值位一起編碼的表示方法都稱為“機器碼”。它們分別為[1]-[4]:原碼、補碼、反碼和移碼。
接下來,又出現(xiàn)新的問題,當(dāng)“機器碼”進行加減乘除法運算時,符號位怎么處理呢?符號位也一同參與運算?還是需要進行單獨處理?進行運算時,哪種編碼是最優(yōu)的呢?下面將主要探討三種機器碼(注:在下面描述的過程中,為了能夠區(qū)分“機器碼”和之前我們使用的帶有正負(fù)號的數(shù),這里把前者(符號數(shù)字化之后的數(shù))即“機器碼”,用[x]原形式來表示原碼(或[x]補表示補碼,[x]反表示反碼)。而后者(即帶有正負(fù)號的數(shù))稱為真值,用X表示;下面僅以小數(shù)為例進行說明)。
(一)原碼
仔細(xì)查看公式(1),首先發(fā)現(xiàn)這里對小數(shù)的范圍有限制,要求絕對值小于1(注:這里只研究定點小數(shù))。
另,不難得出如下規(guī)律:如果是正數(shù)或零,原碼同真值一樣,保持不變;如果是負(fù)數(shù),原碼的定義是1- X。可以理解為1加上該負(fù)數(shù)的相反數(shù),也即1加上該數(shù)的絕對值。再詳細(xì)推敲,1加上某個定點小數(shù)的絕對值得到什么呢?很明顯,與該小數(shù)的絕對值相比,唯一的變化就是小數(shù)點前面的數(shù)值由0變?yōu)?。
經(jīng)上述分析,我們對原碼做一小結(jié):原碼由兩部分構(gòu)成,符號位和數(shù)值位。數(shù)值位部分均保持原來的樣子,不需改變。如果是正數(shù),小數(shù)點前面的0視為符號位,如果是負(fù)數(shù),小數(shù)點前面的1視為符號位。
顯然,原碼非常簡單直觀,但原碼在進行運算時,并不是最優(yōu)的,比如:
仔細(xì)觀察表1可以發(fā)現(xiàn),一個正數(shù)和一個負(fù)數(shù)做加法時,首先我們會比較這兩個數(shù)絕對值的大小,和的符號選擇絕對值大的數(shù)的符號,和的絕對值則為絕對值大的數(shù)減去絕對值小的數(shù),那么,實際上,我們并沒有做加法,真正做的是減法運算。這是非常不方便的。那么,有沒有一種編碼,可以避免這樣的問題呢?在這種情況下,補碼[1]應(yīng)運而生。
(二)補碼
補碼概念的理解,需要先從“?!钡母拍铋_始。
我們可以把模理解為一個容器的容量。當(dāng)超出這個容量時,會自動溢出。如:我們最常見到的時鐘[2],其容量是12,過了12點之后,就會變?yōu)?點,2點……也就是說,超過12的部分將被丟棄。那么,在這個例子當(dāng)中,時鐘的模就是12。模的概念可以幫助我們理解補碼的含義。
補碼的引出:假設(shè)現(xiàn)在時鐘的時針指向4點的位置,要使其指向3點,可以怎么操作呢?很明顯,共有2種方法,順時針撥11格(+11),或逆時針撥1格(-1)。(為了區(qū)分順時針和逆時針,我們用正數(shù)表示順時針方向轉(zhuǎn)動的距離,負(fù)數(shù)表示逆時針方向轉(zhuǎn)動的距離)
從上面的例子,不難發(fā)現(xiàn),+11和-1實現(xiàn)了同樣的作用。主要原因是時鐘的模是12,順時針旋轉(zhuǎn)代表加法運算:4+11=15,而達到模的部分會自動溢出,即15-12=3,即到達3點的位置。逆時針旋轉(zhuǎn)代表減法運算:4-1=3。在這個例子當(dāng)中,+11和-1是完全等價的。也就是說,負(fù)數(shù)-1可以用正數(shù)+11代替,這樣就可以把減法運算改為加法運算。也可以說:+11就是-1的補碼(模為12的情況下)。
剛才的實例告訴我們:如果運算是有模的運算,那么,負(fù)數(shù)總可以找到它對應(yīng)的補碼,用補碼代替它運算,就可以化減為加。而且,負(fù)數(shù)的補碼也是容易求得的,即負(fù)數(shù)加上模即可得到補碼。
我們自然聯(lián)想到,如果計算機中的運算也是有模運算,同樣可以化減為加。但是計算機當(dāng)中的運算是有模運算嗎?在計算機中,數(shù)據(jù)存儲寄存器當(dāng)中,而寄存器的位數(shù)是固定的。那么這個計數(shù)器的容量是256,也就是模為28=256。那么,n位的整數(shù),計算其補碼時,模取多大比較合適呢?下面進行詳細(xì)分析:以n=3為例,如果模為23,寫出對應(yīng)的原碼與補碼如下。
對比表1與表2的“原碼”列,我們發(fā)現(xiàn),通過原碼可以很清楚地辨別出正負(fù)數(shù):首位為0則為正數(shù),首位為1則為負(fù)數(shù)。而對比表1與表2的“補碼”列,卻不能清楚地辨別出正負(fù)數(shù)。比如:補碼0010,既是+2的補碼,又是-6的補碼。到底代表哪一個數(shù),無法確定。很顯然,這是不合適的!為了能夠清楚地辨別出正負(fù)數(shù),而且可以唯一地代表一個數(shù)。可以將“?!比〉酶笠恍?。還以n=3為例,模為23不合適,那么我們嘗試取模為24。
根據(jù)定義,重新寫出正數(shù)以及負(fù)數(shù)的原碼、補碼如下表:
比較表2與表4,發(fā)現(xiàn)正數(shù)的補碼沒有發(fā)生變化。比較表3與表5,發(fā)現(xiàn)負(fù)數(shù)的補碼發(fā)生了變化。這個變化是:第一位(也稱符號位)由0變?yōu)?(特殊值0的符號位則由1變?yōu)?),而數(shù)值位保持不變。這個變化是很有意義的——補碼也可以從符號位直觀地判斷出正數(shù)還是負(fù)數(shù)。比較表4與表5,發(fā)現(xiàn)補碼也能唯一代表一個數(shù)。這樣就避免了上面所提到的各種缺陷。故得出結(jié)論如下:對于一個n位的整數(shù)來說,求補碼時,應(yīng)取模為2n+1。其定義為:
二、總結(jié)
從機器碼出發(fā),通過對原碼的定義和運算進行分析,指出原碼做加法運算時存在的不足,進而引出補碼,計算機做加減法運算一般都是采用補碼完成的,所以,補碼的運用非常廣泛。但是求補碼的過程又是曲折的,為了更方便快捷地求出補碼,引出了反碼。從而清晰地展示了三種編碼之間的聯(lián)系,對機器碼的進一步深入理解有一定的意義。
[ 參 考 文 獻 ]
[1] 羅嘉慶,周世杰,徐潔.原碼、反碼和補碼的教學(xué)探討[J].計算機教育,2015(10):42-45.
[2] 謝元成. 微機系統(tǒng)中補碼的原理及意義[J].科技創(chuàng)新論壇,2014(17):181-128.
[3] 孫麗.計算思維下再談補碼設(shè)計思想[J].電腦知識與技術(shù),2015(29):70-71.
[4] 楊學(xué)穎,周建業(yè).計算機補碼概念探究[J].河南科技學(xué)院學(xué)報,2011(3):90-94.
[特約編輯:黃緊德]