趙煜 馬萌
摘要:從機(jī)器碼出發(fā),介紹了原碼、反碼、補(bǔ)碼的定義以及三者之間的內(nèi)在聯(lián)系,由于原碼在加減運(yùn)算中的不足引入了補(bǔ)碼,為了方便求得補(bǔ)碼又引入了反碼,從而清晰地展示了三者編碼之間的聯(lián)系,使用VEE可視化語言實(shí)現(xiàn)了三者之間的轉(zhuǎn)化,通過2種方法介紹了負(fù)數(shù)原碼、反碼、補(bǔ)碼之間的程序設(shè)計(jì)過程,并且介紹了機(jī)器數(shù)之間的加減運(yùn)算方法,以及具體運(yùn)算過程,使用人工算法驗(yàn)證了該程序設(shè)計(jì)的正確性。
關(guān)鍵詞:原碼;反碼;補(bǔ)碼;運(yùn)算過程
中圖分類號:TP316文獻(xiàn)標(biāo)志碼:A文章編號:1008-1739(2020)13-56-4
0引言
計(jì)算機(jī)能夠按照程序自動(dòng)運(yùn)算和快速處理大量數(shù)據(jù),既可以進(jìn)行數(shù)值計(jì)算,又可以進(jìn)行邏輯計(jì)算,還有存儲記憶的功能,其中處理的大量數(shù)據(jù)包括加減乘除運(yùn)算的數(shù)值型數(shù)據(jù)和不能進(jìn)行運(yùn)算的非數(shù)值型數(shù)據(jù)。為了達(dá)到方便、容易區(qū)分和存儲等要求,計(jì)算機(jī)內(nèi)部使用二進(jìn)制存儲數(shù)據(jù)。
計(jì)算機(jī)中需要原碼、補(bǔ)碼和反碼3種編碼,和計(jì)算機(jī)的硬件有關(guān),二進(jìn)制的加法,一個(gè)異或門就能實(shí)現(xiàn),多位加法器的實(shí)現(xiàn)很容易,然而減法沒有找到直接的硬件,但是通過補(bǔ)碼能把減法轉(zhuǎn)換成加法來做,這樣一種硬件執(zhí)行結(jié)構(gòu)就可以實(shí)現(xiàn)加與減2種基本運(yùn)算。這樣就出現(xiàn)了補(bǔ)碼,對補(bǔ)碼的求解過程,其中一個(gè)步驟就剛好形成了反碼,反碼是原碼轉(zhuǎn)換成補(bǔ)碼的過渡碼。
1原碼、反碼、補(bǔ)碼的基本概念
一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式叫做這個(gè)數(shù)的機(jī)器數(shù),機(jī)器數(shù)是帶符號的,計(jì)算機(jī)用機(jī)器數(shù)的最高位放符號位,正數(shù)為0,負(fù)數(shù)為1。因?yàn)榈谝晃皇欠栁?,所以機(jī)器數(shù)的形式值就不等于真正的數(shù)值,將帶符號的機(jī)器數(shù)對應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值。原碼、反碼、補(bǔ)碼是機(jī)器存儲一個(gè)具體數(shù)字的編碼方式,就是為了理解計(jì)算機(jī)使用二進(jìn)制進(jìn)行計(jì)算的原理[1]。
原碼是機(jī)器數(shù)中最簡單的一種形式,原碼由符號位和數(shù)值位兩部分構(gòu)成。數(shù)值位部分均保持原來的樣子,不需改變。如果是正數(shù),最前面的0視為符號位;如果是負(fù)數(shù),最前面的1視為符號位,數(shù)值位就是真值的絕對值,原碼又稱帶符號的絕對值。原碼進(jìn)行加減運(yùn)算時(shí),一個(gè)正數(shù)和一個(gè)負(fù)數(shù)運(yùn)算時(shí)的結(jié)果可能為正也可能為負(fù),而且是絕對值進(jìn)行比較,這樣相對很不方便,因此引入了補(bǔ)碼。
反碼通常是用來由原碼求補(bǔ)碼或者由補(bǔ)碼求原碼的過渡碼,反碼跟原碼是正數(shù)時(shí)一樣;負(fù)數(shù)時(shí),反碼就是原碼符號位除外,其他位按位取反。
補(bǔ)碼是計(jì)算機(jī)把減法運(yùn)算轉(zhuǎn)化為加法運(yùn)算的關(guān)鍵編碼,正數(shù)的補(bǔ)碼是它本身,負(fù)數(shù)的補(bǔ)碼是除符號位,原碼取反加1。
2算法設(shè)計(jì)過程
2.1 VEE可視化語言
HP VEE是一種主要用于儀器控制和測量處理的可視化編程語言,自1990年以圖形化界面和數(shù)據(jù)流編程為核心的1.0版由HP公司正式發(fā)布以來,提升6.0位核心,集成儀器設(shè)備控制、高級數(shù)據(jù)采集以及處理、數(shù)據(jù)分析等眾多先進(jìn)技術(shù),可用于Windows,SUN,Unix等多種平臺的測試軟件開發(fā)環(huán)境。
HP VEE具有以下主要特點(diǎn):①圖形化編程;②豐富的儀器I/O驅(qū)動(dòng);③虛擬儀器測試;④自動(dòng)數(shù)據(jù)類型轉(zhuǎn)化;⑤強(qiáng)大的數(shù)學(xué)分析能力;⑥開放的編程環(huán)境;⑦網(wǎng)絡(luò)支持。此外,VEE還是一種基于圖形式開發(fā)、調(diào)試和運(yùn)行程序的集成化環(huán)境,其基本編程單元是一系列的圖形化功能控件,每個(gè)控件都存在一個(gè)或多個(gè)輸入、輸出端口,選擇合適的端口進(jìn)行連接,即可完成程序的運(yùn)行流程。本文主要使用VEE可視化語言實(shí)現(xiàn)原碼、補(bǔ)碼和反碼相互轉(zhuǎn)換關(guān)系的設(shè)計(jì)過程,展示原碼、補(bǔ)碼和反碼相互轉(zhuǎn)換關(guān)系。
2.2具體實(shí)施過程
由于正數(shù)的原碼、反碼、補(bǔ)碼都相同,因此正數(shù)的轉(zhuǎn)換相對簡單,直接符號位為0,真值不變即可。
2.3程序?qū)崿F(xiàn)原碼、反碼、補(bǔ)碼轉(zhuǎn)換過程
(1)使用定義法實(shí)現(xiàn)負(fù)數(shù)原碼、反碼、補(bǔ)碼之間的轉(zhuǎn)化
原碼轉(zhuǎn)化為二進(jìn)制,取反為反碼,再加1為補(bǔ)碼。具體使用VEE語言實(shí)現(xiàn)程序設(shè)計(jì)過程為:可選擇要轉(zhuǎn)化數(shù)的類型,可選擇十進(jìn)制數(shù)或二進(jìn)制數(shù)。如果是十進(jìn)制數(shù)需要轉(zhuǎn)換成二進(jìn)制然后進(jìn)行求反碼和補(bǔ)碼。十進(jìn)制轉(zhuǎn)二進(jìn)制使用除二法,即div函數(shù)和mod函數(shù),被轉(zhuǎn)換數(shù)循環(huán)執(zhí)行div/2,并且每個(gè)數(shù)需要取mod,即除二取余,然后將這些數(shù)轉(zhuǎn)化為字符串加起來,即實(shí)現(xiàn)了十進(jìn)制轉(zhuǎn)二進(jìn)制數(shù)。
需要字符串轉(zhuǎn)數(shù)組及取反,字符串轉(zhuǎn)數(shù)組首先用到strFromLen(str,from,len)函數(shù),輸入str為整個(gè)字符串,from是從第幾個(gè)字符開始取,len是要取得的字符長度。其次,字符串轉(zhuǎn)數(shù)組要用到Collector函數(shù),該函數(shù)實(shí)現(xiàn)從strFromLen(str, from,len)函數(shù)中取得的單個(gè)字符收集起來,組成一個(gè)數(shù)組,其中Collector函數(shù)中Data為單個(gè)字符輸入,XEQ為輸出觸發(fā),字符串轉(zhuǎn)數(shù)組取反即將0輸出為1,1輸出為1,即完成了原碼轉(zhuǎn)反碼的過程。反碼轉(zhuǎn)補(bǔ)碼需要再加1,此處使用二進(jìn)制轉(zhuǎn)十進(jìn)制,然后加1再轉(zhuǎn)為二進(jìn)制的辦法,二進(jìn)制轉(zhuǎn)十進(jìn)制使用bits(str)函數(shù),即乘2相加法,上述為使用定義法實(shí)現(xiàn)原碼、反碼、補(bǔ)碼之間的轉(zhuǎn)化。
(2)先求模,然后求反碼和補(bǔ)碼
補(bǔ)碼設(shè)計(jì)流程如圖1所示。
2.4補(bǔ)碼實(shí)現(xiàn)運(yùn)算過程
CPU中有加法器但沒有減法器,通過寫出一位全減器的真值表,設(shè)計(jì)出硬件電路并將其級聯(lián),可得到一個(gè)減法器,但是大部分情況設(shè)計(jì)一個(gè)減法器還不如用加法器替代,將減數(shù)取反加一與被減數(shù)相加即可把減法運(yùn)算轉(zhuǎn)化為加法,將減數(shù)取反加一的操作就是將負(fù)數(shù)用補(bǔ)碼的形式表示,也就是用補(bǔ)碼這種數(shù)值編碼方式實(shí)現(xiàn)了將減法轉(zhuǎn)變?yōu)榧臃ǖ摹?p>
上邊已經(jīng)講述了補(bǔ)碼的計(jì)算過程,在進(jìn)行加減運(yùn)算時(shí)只要將減法轉(zhuǎn)化為加法,然后使用補(bǔ)碼計(jì)算即可,計(jì)算結(jié)果再由補(bǔ)碼轉(zhuǎn)化為原碼即為真實(shí)計(jì)算結(jié)果。
為了便于理解,以鐘表來表示,鐘表中12點(diǎn)倒退3點(diǎn)就是9點(diǎn),超過12點(diǎn)重新使用1~12來表示,12是鐘表的模,順時(shí)針代表溢出,超過12為溢出,比如10點(diǎn)加5點(diǎn),為:10+5=15,溢出12,15-12為3點(diǎn)。逆時(shí)針為減法,3點(diǎn)往后倒5點(diǎn)從鐘表中不難看出是10點(diǎn),這里減5 h,其實(shí)就是計(jì)算機(jī)中的補(bǔ)碼,即12-5,對應(yīng)7,將減法轉(zhuǎn)化為加法,即3+(12-5)為10點(diǎn),便于將減法轉(zhuǎn)為加法,“?!钡奶卣鳛闇p去一個(gè)數(shù)等價(jià)于加上這個(gè)數(shù)的補(bǔ)數(shù),計(jì)算機(jī)引入了模,以負(fù)數(shù)為例,0> >=-2 ,此時(shí)模為2+1。
鐘表中,如果9點(diǎn)+8點(diǎn)=17點(diǎn)對應(yīng)鐘表的5點(diǎn),此處即有一個(gè)溢出的概念,在計(jì)算機(jī)中也存在溢出,溢出即一個(gè)位二進(jìn)制的補(bǔ)碼,其表達(dá)范圍是-2-1+1~2-1-1,如果超出這個(gè)范圍就稱為溢出。
符號位有00,01,11,10四種可能,其中00,01代表正數(shù);11,10代表負(fù)數(shù);01為正溢出,10為負(fù)溢出。
分別以符號位為00,01,11,10四種舉例說明,運(yùn)算示意表如表2所示。
3實(shí)驗(yàn)仿真
使用十進(jìn)制數(shù)進(jìn)行一組加減,然后手動(dòng)算法與設(shè)計(jì)算法進(jìn)行比較。比如5+(-7),計(jì)算結(jié)果為-2,使用概念計(jì)算:
4結(jié)束語
討論了原碼、反碼、補(bǔ)碼的轉(zhuǎn)化過程,簡單介紹了如何使用程序來實(shí)現(xiàn)轉(zhuǎn)換過程。具體說明了使用補(bǔ)碼的運(yùn)算過程,并且針對溢出問題進(jìn)行了舉例說明,并給出了根據(jù)溢出結(jié)果得到正確結(jié)果的方法。學(xué)習(xí)是一個(gè)不斷積累的過程,在深入理解原碼、反碼和補(bǔ)碼3種編碼之間相互關(guān)系的同時(shí),對計(jì)算機(jī)中數(shù)值的理解變得更加容易,能輕松地進(jìn)行原碼、反碼、補(bǔ)碼的相互轉(zhuǎn)化,并且可以實(shí)現(xiàn)運(yùn)算。
參考文獻(xiàn)
[1]唐朔飛.計(jì)算機(jī)組成原理:第2版[M].北京:高等教育出版社, 2012.
[2]羅嘉慶,周世杰,徐潔.原碼、反碼和補(bǔ)碼的教學(xué)探討[J].計(jì)算機(jī)教育,2015(10):42-45.
[3]孫麗.計(jì)算思維下再談補(bǔ)碼設(shè)計(jì)思想[J].電腦知識與技術(shù), 2015,11(29):70-71.
[4]聽雨軒工作室.AgilentVEE虛擬儀器工程設(shè)計(jì)與開發(fā)[M].北京:國防工業(yè)出版社,2004.
[5]楊學(xué)穎,周建業(yè).計(jì)算機(jī)補(bǔ)碼概念探究[J].河南科技學(xué)院學(xué)報(bào)(自然科學(xué)版),2011,39(3):90-94.
[6]哈馬克.計(jì)算機(jī)組成與嵌入式系統(tǒng):第6版[M].王國華,譯.北京:機(jī)械工業(yè)出版社,2013.