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