羅嘉慶 周世杰 徐潔
摘要:有符號(hào)數(shù)字的存儲(chǔ)包括原碼、反碼和補(bǔ)碼(國(guó)內(nèi)教材采用術(shù)語(yǔ))3種表示,是許多計(jì)算機(jī)專(zhuān)業(yè)基礎(chǔ)課程的重要教學(xué)內(nèi)容,然而國(guó)內(nèi)外教材和網(wǎng)絡(luò)百科中的相關(guān)內(nèi)容存在很多不一致的地方,可能會(huì)導(dǎo)致教學(xué)中的困惑和誤區(qū)。文章將分別從講解思路、術(shù)語(yǔ)定義和數(shù)學(xué)本質(zhì)3方面進(jìn)行對(duì)比分析并提出一些可能的改進(jìn)建議,包括規(guī)范術(shù)語(yǔ),注重計(jì)算機(jī)基本操作和相關(guān)數(shù)學(xué)概念,強(qiáng)調(diào)不同表示的產(chǎn)生原因、關(guān)系和符號(hào)位差異等。
關(guān)鍵詞:原碼;反碼;補(bǔ)碼
0.引言
數(shù)字存儲(chǔ)與數(shù)字計(jì)算緊密相連,是計(jì)算機(jī)專(zhuān)業(yè)的基礎(chǔ)課程,如計(jì)算機(jī)導(dǎo)論、計(jì)算機(jī)組成原理、匯編語(yǔ)言等,是要求學(xué)生理解和掌握的重要知識(shí)點(diǎn)。有符號(hào)數(shù)存儲(chǔ)涉及數(shù)字的符號(hào),包括原碼、反碼和補(bǔ)碼,又是其中的教學(xué)難點(diǎn),然而眾多國(guó)內(nèi)教材包括電子工業(yè)出版社的《8086/8088宏匯編語(yǔ)言程序設(shè)計(jì)教程》(1998年出版)、高等教育出版社的《數(shù)字電子技術(shù)基礎(chǔ)》(1998年出版,2001年重?。㈦娮庸I(yè)出版社的《計(jì)算機(jī)組成原理》(2004年出版)和清華大學(xué)出版社的《匯編語(yǔ)言程序設(shè)計(jì)》(2009年出版)以及網(wǎng)絡(luò)百科包括百度百科和360百科(更新截止2014年11月18日),國(guó)外教材包括ComputerOrganization and Embedded System(2011年出版)和Foundations of Computer Science(2007年出版)以及網(wǎng)絡(luò)百科Wikipedia(更新截止2014年11月18日),對(duì)于有符號(hào)數(shù)存儲(chǔ)的講解內(nèi)容存在眾多不一致的地方,教師需要進(jìn)一步分析與探討,以避免在教學(xué)過(guò)程中令學(xué)生產(chǎn)生誤解。
1、講解思路
1.1產(chǎn)生原因
有符號(hào)數(shù)字的存儲(chǔ)有3種表示:原碼、反碼和補(bǔ)碼。現(xiàn)在計(jì)算機(jī)大多選用補(bǔ)碼,早期部分計(jì)算機(jī)選用原碼或反碼,如IBM 709x系列采用原碼,PDP-1、CDC 160系列、CDC 6000系列、UNIVAC 1100系列和LINC計(jì)算機(jī)采用反碼。在教學(xué)過(guò)程中,學(xué)生通常會(huì)產(chǎn)生兩點(diǎn)疑惑:①為什么有符號(hào)數(shù)字有3種表示?②為什么計(jì)算機(jī)不選用相對(duì)直觀的原碼而選用晦澀難懂的補(bǔ)碼?國(guó)外網(wǎng)絡(luò)百科通過(guò)例子詳細(xì)說(shuō)明了原碼和反碼在計(jì)算過(guò)程中可能出現(xiàn)的問(wèn)題。具體而言,原碼的符號(hào)位不能參與計(jì)算,反碼的計(jì)算需要處理進(jìn)位或借位,同時(shí)存在—0,只有補(bǔ)碼的計(jì)算能夠保持與無(wú)符號(hào)二進(jìn)制數(shù)的計(jì)算一致。國(guó)內(nèi)教材和網(wǎng)絡(luò)百科往往從以下3方面描述:①數(shù)學(xué)表達(dá)式;②求解方法;③硬件設(shè)計(jì)的難易程度。相比較而言,國(guó)外網(wǎng)絡(luò)百科更有利于把握計(jì)算的本質(zhì),有助于學(xué)生理解不同表示產(chǎn)生的原因。
1.2基本方法
國(guó)外教材通常采用方法→表示的講解方式,即先介紹二進(jìn)制中兩種補(bǔ)的方法(methods ofcomplement):眾一的補(bǔ)(ones' complement)和二的補(bǔ)(two's complement)。補(bǔ)的方法是一種只用正數(shù)的加法計(jì)算從一個(gè)數(shù)中減去另一個(gè)數(shù)的技術(shù)。 一個(gè)二進(jìn)制數(shù)的眾一的補(bǔ)被定義為這個(gè)數(shù)的所有位取反(0變l,1變0)。一個(gè)n位二進(jìn)制數(shù)的二的補(bǔ)被定義為2n的補(bǔ),等同于眾一的補(bǔ)(取反運(yùn)算)加1。然后,介紹兩種有符號(hào)數(shù)的表示:眾一的補(bǔ)表示(英文:ones'complement representation,中文:反碼)和二的補(bǔ)表示(英文:two's complement representation,中文:補(bǔ)碼)。眾一的補(bǔ)和二的補(bǔ)系統(tǒng)/計(jì)算(one's complement system/arithmetic and two'scomplement system/arithmetic)中的負(fù)數(shù),分別用它們對(duì)應(yīng)的正數(shù)的眾一的補(bǔ)和二的補(bǔ)表示。
部分國(guó)內(nèi)教材則采用表示→運(yùn)算的講解方式,即先定義有符號(hào)二進(jìn)制數(shù)的表示,即原碼、反碼和補(bǔ)碼,再定義一種補(bǔ)碼的運(yùn)算——求補(bǔ)運(yùn)算。具體而言,求補(bǔ)運(yùn)算被定義為一個(gè)已為補(bǔ)碼表示的數(shù),連同符號(hào)位一起按位求反后,在最低位加補(bǔ),這種定義容易混淆概念:①如果它對(duì)應(yīng)二的補(bǔ),那么可以理解為一個(gè)數(shù)學(xué)操作符,輸入不僅僅限定為已為補(bǔ)碼表示的數(shù),例如,一個(gè)負(fù)數(shù)對(duì)應(yīng)正數(shù)的二進(jìn)制表示;②如果這種定義對(duì)應(yīng)二的補(bǔ)算術(shù)(two's complement arithmetic),那么指代一個(gè)系統(tǒng),這個(gè)系統(tǒng)中一些基本的算術(shù)操作如加、減和乘就與尢符號(hào)二進(jìn)制數(shù)的相同。此外,還可能會(huì)產(chǎn)生以下一些問(wèn)題:當(dāng)輸入一個(gè)二進(jìn)制數(shù)時(shí),計(jì)算機(jī)將如何鑒別這個(gè)數(shù)已為補(bǔ)碼表示(注意并非所有計(jì)算機(jī)都采用補(bǔ)碼)?如果不能鑒別,那么這種運(yùn)算的意義何在?又將如何定義?
1.3求解過(guò)程
在求解有符號(hào)數(shù)表示時(shí),國(guó)外教材出發(fā)點(diǎn)是數(shù)本身,給定一個(gè)有符號(hào)數(shù)χ,各種表示求解過(guò)程如下:
符號(hào)和數(shù)量表示(英文:sign and magnituderepresentation,中文:原碼):最高位為符號(hào)位,0表示正數(shù),1表示負(fù)數(shù),剩余位為x的數(shù)量(絕對(duì)值)。
眾一的補(bǔ)表示(反碼):如果x為L(zhǎng)正數(shù),則是其二進(jìn)制表示;如果χ為負(fù)數(shù),則是其對(duì)應(yīng)正數(shù)的位補(bǔ)(英文:bit complement/bitwise NOT,中文:按位取反)——執(zhí)行每一位邏輯否定的一元操作。
二的補(bǔ)表示(補(bǔ)碼):如果x為正數(shù),則是其二進(jìn)制表示;如果x為負(fù)數(shù),則是其對(duì)應(yīng)正數(shù)的二的補(bǔ)(所有位取反后加1)。
在求解有符號(hào)數(shù)表示時(shí),部分國(guó)內(nèi)教材出發(fā)點(diǎn)是原碼,同樣給定一個(gè)數(shù)x,各種表示求解方式如下:
原碼:最高位為符號(hào)位,其余位為χ的絕對(duì)值。
反碼:如果x為正數(shù),則與原碼相同;如果x為負(fù)數(shù),保持原碼符號(hào)位不變,其余位變反,
補(bǔ)碼:如果χ為正數(shù),則與原碼相同;如果χ為負(fù)數(shù),保持原碼符號(hào)位不變,其余化先變反,然后在末位加1。
在操作層面,國(guó)內(nèi)外教材求解結(jié)果一致,但在理解層面,國(guó)內(nèi)教材容易引起誤解:
(1)原碼、反碼和補(bǔ)碼之間的關(guān)系從原碼出發(fā)求解反碼和補(bǔ)碼,學(xué)生會(huì)誤以為原碼是后兩者的基礎(chǔ)。原碼的出發(fā)點(diǎn)是符號(hào)的表示(符號(hào)位),即用O表示正數(shù),用1表示負(fù)數(shù);反碼和補(bǔ)碼的出發(fā)點(diǎn)是減法的運(yùn)算,即用兩個(gè)正數(shù)的加法取代兩個(gè)數(shù)的減法,因此反碼和補(bǔ)碼不能簡(jiǎn)單理解為由原碼變換而成。
(2)原碼、反碼和補(bǔ)碼符號(hào)位的差異。求解反碼和補(bǔ)碼過(guò)程中,保持原碼符號(hào)位不變,學(xué)生會(huì)誤以為原碼、反碼和補(bǔ)碼的符號(hào)位相同。雖然符號(hào)位都表示數(shù)的正負(fù),但是反碼和補(bǔ)碼與原碼符號(hào)位的差別在于它們有權(quán)重(weight),如補(bǔ)碼的符號(hào)位權(quán)重為—( 2n-l)。
2、術(shù)語(yǔ)定義
2.1完備性
國(guó)外教材關(guān)于術(shù)語(yǔ)定義從操作→方法→表示具有連貫性和一致性,國(guó)內(nèi)教材術(shù)語(yǔ)定義(包括譯著)存在混用和缺失的現(xiàn)象,表1對(duì)比了國(guó)內(nèi)外教材涉及有符號(hào)數(shù)字存儲(chǔ)的術(shù)語(yǔ)。
從表l可以看出,大部分國(guó)內(nèi)教材對(duì)方法的術(shù)語(yǔ)(眾一的補(bǔ)和二的補(bǔ))缺乏明確的定義,即求解表示(眾一的補(bǔ)表示和二的補(bǔ)表示)的過(guò)程。正因如此,部分譯著將反碼和補(bǔ)碼與眾一的補(bǔ)和二的補(bǔ)(參見(jiàn)1.2節(jié)定義)對(duì)應(yīng),另一部分譯著將反碼和補(bǔ)碼與眾一的補(bǔ)表示和二的補(bǔ)表示(參見(jiàn)1.2節(jié)定義)對(duì)應(yīng),導(dǎo)致方法和表示的術(shù)語(yǔ)沖突。由此可見(jiàn),在定義表示的形式化描述時(shí),更應(yīng)該關(guān)注其求解方法的定義與內(nèi)涵。
此外,國(guó)內(nèi)教材對(duì)術(shù)語(yǔ)原碼/原碼表示法、反碼/反碼表示法和補(bǔ)碼/補(bǔ)碼表示法存在混用現(xiàn)象。具體而言,部分教材只使用原碼、反碼和補(bǔ)碼,另一部分教材將原碼/原碼表示法、反碼/反碼表示法和補(bǔ)碼/補(bǔ)碼表示法混合使用(沒(méi)有明確區(qū)分)。
2.2規(guī)范性
國(guó)外教材中的術(shù)語(yǔ)非常形象和直觀。例如,眾一的補(bǔ)中的“眾一”表示二進(jìn)制數(shù)中的每一位都用l減去這一位替代(與按位取反效果相同);二的補(bǔ)中的“二”表示基數(shù)2;兩者中的“補(bǔ)”表明了它們之問(wèn)的關(guān)系,即二的補(bǔ)等于眾一的補(bǔ)加1。國(guó)內(nèi)教材中的術(shù)語(yǔ)在認(rèn)知上可能造成歧義。例如,原碼中的“原”有原始的意思,學(xué)生容易誤解為原碼是反碼和補(bǔ)碼的基礎(chǔ)。真值被定義為日常書(shū)寫(xiě)習(xí)慣中用+或-表示的數(shù),英文中有與其沖突的術(shù)語(yǔ)truth value(同樣翻譯為真值),又稱(chēng)為邏輯值(logical value),是指相對(duì)于真的程度。在經(jīng)典邏輯中,唯一可能的真值是真和假,模糊邏輯和其他形式的多值邏輯中會(huì)使用比真和假更多的真值。此外,國(guó)內(nèi)網(wǎng)絡(luò)百科將原碼翻譯為true form并不準(zhǔn)確,對(duì)應(yīng)英文術(shù)語(yǔ)應(yīng)該是sign and magnitude representation。
3、數(shù)學(xué)本質(zhì)
3.1必要性
形式化的描述是一把雙刃劍,一方面能夠用數(shù)學(xué)語(yǔ)言準(zhǔn)確地描述概念本質(zhì),另一方面會(huì)因?yàn)檫^(guò)度抽象而增加學(xué)生理解的難度。部分國(guó)內(nèi)教材對(duì)原碼、反碼和補(bǔ)碼都給出了數(shù)學(xué)表達(dá)式。原碼的定義本來(lái)非常直觀且容易理解,原碼用符號(hào)位表示數(shù)的正負(fù),而符號(hào)位沒(méi)有權(quán)重,不能直接參與運(yùn)算。原碼的數(shù)學(xué)表達(dá)式可能是一個(gè)由簡(jiǎn)變繁的過(guò)程且存在以下一些問(wèn)題:這種表達(dá)式的實(shí)質(zhì)和意義是什么?是否與原碼的定義相關(guān)?原碼沒(méi)有權(quán)重或值的符號(hào)位是否能夠通過(guò)算術(shù)運(yùn)算來(lái)定義?將一個(gè)負(fù)數(shù)χ的原碼定義為2n-1-X,即表示符號(hào)位的值為2n-l,相應(yīng)的運(yùn)算規(guī)則如何定義?
3.2準(zhǔn)確性
國(guó)內(nèi)教材的數(shù)學(xué)表達(dá)存在細(xì)微差異。國(guó)外教材:在眾一的補(bǔ)表示中,一個(gè)負(fù)數(shù)χ被表示為其對(duì)應(yīng)正數(shù)的眾一的補(bǔ),被定義為(2n-1)-(-X):在二的補(bǔ)表示中,一個(gè)負(fù)數(shù)x被表示為其對(duì)應(yīng)正數(shù)的二的補(bǔ)(相對(duì)于2n的補(bǔ)),被定義為2n-(一x)。國(guó)內(nèi)教材:一個(gè)負(fù)數(shù)x的反碼和補(bǔ)碼分別被定義為(2n-l)+x和2n+x。在計(jì)算層面,國(guó)內(nèi)外教材的運(yùn)算結(jié)果一致,因?yàn)? ( -x)=x,但在理解層面,“減去一個(gè)正數(shù)”與“加上一個(gè)負(fù)數(shù)”存在明顯差異,失之毫厘,差之千里。計(jì)算機(jī)只能識(shí)別0和l組成的序列,負(fù)號(hào)并不存在。負(fù)數(shù)x可以表示為0-(-x),為了將減法轉(zhuǎn)換為加法,需要求-x(正數(shù))的算術(shù)負(fù)值。數(shù)學(xué)表達(dá)式(2n-l)+x和2n+x并不能準(zhǔn)確描述這一過(guò)程。此外,部分國(guó)內(nèi)教材直接用模運(yùn)算定義反碼和補(bǔ)碼,模運(yùn)算可以用于解釋反碼和補(bǔ)碼如何工作,但并不能作為其正式定義,因?yàn)樗皇窍嚓P(guān)概念的直接描述。
4、改進(jìn)建議
國(guó)內(nèi)外教材的差異可能會(huì)導(dǎo)致教學(xué)困惑和誤區(qū)。為了澄清概念和消除誤區(qū),筆者提出以下幾點(diǎn)改進(jìn)建議。
(1)統(tǒng)一術(shù)語(yǔ):建議用“取一個(gè)數(shù)的反碼”和“取一個(gè)數(shù)的補(bǔ)碼”分別對(duì)應(yīng)“眾一的補(bǔ)”和“二的補(bǔ)”;用“反碼”和“補(bǔ)碼”分別對(duì)應(yīng)眾一的補(bǔ)和二的補(bǔ)后的結(jié)果;用“原碼表示”“反碼表示”和“補(bǔ)碼表示”分別對(duì)應(yīng)“符號(hào)和數(shù)量表示”“眾一的補(bǔ)表示”和“二的補(bǔ)表示”。
(2)修改方法:在講解求解過(guò)程時(shí),保持與補(bǔ)的方法(眾一的補(bǔ)和二的補(bǔ))一致,摒棄原碼的基礎(chǔ)上求解反碼和補(bǔ)碼的過(guò)程。
(3)更正定義:去掉原碼的數(shù)學(xué)表達(dá)式,將反碼和補(bǔ)碼的數(shù)學(xué)表達(dá)式更正為(2n-l)一(一x)和2n-(-x)。
(4)更新百科:網(wǎng)絡(luò)百科有時(shí)比教材更有影響力,因?yàn)樵S多學(xué)生遇到疑問(wèn)都會(huì)在網(wǎng)上求答案。截止2014年11月28日,百度百科中反碼和補(bǔ)碼的瀏覽次數(shù)分別達(dá)到151 035和437 146,因此有必要規(guī)范和更新網(wǎng)絡(luò)百科的相關(guān)內(nèi)容,避免將教學(xué)誤區(qū)擴(kuò)大化。
5、結(jié)語(yǔ)
通過(guò)對(duì)比國(guó)內(nèi)外教材和網(wǎng)絡(luò)百科,筆者發(fā)現(xiàn)國(guó)內(nèi)部分教材關(guān)于有符號(hào)數(shù)字存儲(chǔ)的相關(guān)內(nèi)容包括術(shù)語(yǔ)、概念和定義都有待進(jìn)一步明確和清晰,建議統(tǒng)一術(shù)語(yǔ),更正和修改定義和方法,更新網(wǎng)絡(luò)百科相關(guān)內(nèi)容,避免在教學(xué)過(guò)程中產(chǎn)生誤區(qū)。