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