罗嘉庆 周世杰 徐洁
摘要:有符号数字的存储包括原码、反码和补码(国内教材采用术语)3种表示,是许多计算机专业基础课程的重要教学内容,然而国内外教材和网络百科中的相关内容存在很多不一致的地方,可能会导致教学中的困惑和误区。文章将分别从讲解思路、术语定义和数学本质3方面进行对比分析并提出一些可能的改进建议,包括规范术语,注重计算机基本操作和相关数学概念,强调不同表示的产生原因、关系和符号位差异等。
关键词:原码;反码;补码
0.引言
数字存储与数字计算紧密相连,是计算机专业的基础课程,如计算机导论、计算机组成原理、汇编语言等,是要求学生理解和掌握的重要知识点。有符号数存储涉及数字的符号,包括原码、反码和补码,又是其中的教学难点,然而众多国内教材包括电子工业出版社的《8086/8088宏汇编语言程序设计教程》(1998年出版)、高等教育出版社的《数字电子技术基础》(1998年出版,2001年重印)、电子工业出版社的《计算机组成原理》(2004年出版)和清华大学出版社的《汇编语言程序设计》(2009年出版)以及网络百科包括百度百科和360百科(更新截止2014年11月18日),国外教材包括ComputerOrganization and Embedded System(2011年出版)和Foundations of Computer Science(2007年出版)以及网络百科Wikipedia(更新截止2014年11月18日),对于有符号数存储的讲解内容存在众多不一致的地方,教师需要进一步分析与探讨,以避免在教学过程中令学生产生误解。
1、讲解思路
1.1产生原因
有符号数字的存储有3种表示:原码、反码和补码。现在计算机大多选用补码,早期部分计算机选用原码或反码,如IBM 709x系列采用原码,PDP-1、CDC 160系列、CDC 6000系列、UNIVAC 1100系列和LINC计算机采用反码。在教学过程中,学生通常会产生两点疑惑:①为什么有符号数字有3种表示?②为什么计算机不选用相对直观的原码而选用晦涩难懂的补码?国外网络百科通过例子详细说明了原码和反码在计算过程中可能出现的问题。具体而言,原码的符号位不能参与计算,反码的计算需要处理进位或借位,同时存在—0,只有补码的计算能够保持与无符号二进制数的计算一致。国内教材和网络百科往往从以下3方面描述:①数学表达式;②求解方法;③硬件设计的难易程度。相比较而言,国外网络百科更有利于把握计算的本质,有助于学生理解不同表示产生的原因。
1.2基本方法
国外教材通常采用方法→表示的讲解方式,即先介绍二进制中两种补的方法(methods ofcomplement):众一的补(ones' complement)和二的补(two's complement)。补的方法是一种只用正数的加法计算从一个数中减去另一个数的技术。 一个二进制数的众一的补被定义为这个数的所有位取反(0变l,1变0)。一个n位二进制数的二的补被定义为2n的补,等同于众一的补(取反运算)加1。然后,介绍两种有符号数的表示:众一的补表示(英文:ones'complement representation,中文:反码)和二的补表示(英文:two's complement representation,中文:补码)。众一的补和二的补系统/计算(one's complement system/arithmetic and two'scomplement system/arithmetic)中的负数,分别用它们对应的正数的众一的补和二的补表示。
部分国内教材则采用表示→运算的讲解方式,即先定义有符号二进制数的表示,即原码、反码和补码,再定义一种补码的运算——求补运算。具体而言,求补运算被定义为一个已为补码表示的数,连同符号位一起按位求反后,在最低位加补,这种定义容易混淆概念:①如果它对应二的补,那么可以理解为一个数学操作符,输入不仅仅限定为已为补码表示的数,例如,一个负数对应正数的二进制表示;②如果这种定义对应二的补算术(two's complement arithmetic),那么指代一个系统,这个系统中一些基本的算术操作如加、减和乘就与尢符号二进制数的相同。此外,还可能会产生以下一些问题:当输入一个二进制数时,计算机将如何鉴别这个数已为补码表示(注意并非所有计算机都采用补码)?如果不能鉴别,那么这种运算的意义何在?又将如何定义?
1.3求解过程
在求解有符号数表示时,国外教材出发点是数本身,给定一个有符号数χ,各种表示求解过程如下:
符号和数量表示(英文:sign and magnituderepresentation,中文:原码):最高位为符号位,0表示正数,1表示负数,剩余位为x的数量(绝对值)。
众一的补表示(反码):如果x为L正数,则是其二进制表示;如果χ为负数,则是其对应正数的位补(英文:bit complement/bitwise NOT,中文:按位取反)——执行每一位逻辑否定的一元操作。
二的补表示(补码):如果x为正数,则是其二进制表示;如果x为负数,则是其对应正数的二的补(所有位取反后加1)。
在求解有符号数表示时,部分国内教材出发点是原码,同样给定一个数x,各种表示求解方式如下:
原码:最高位为符号位,其余位为χ的绝对值。
反码:如果x为正数,则与原码相同;如果x为负数,保持原码符号位不变,其余位变反,
补码:如果χ为正数,则与原码相同;如果χ为负数,保持原码符号位不变,其余化先变反,然后在末位加1。
在操作层面,国内外教材求解结果一致,但在理解层面,国内教材容易引起误解:
(1)原码、反码和补码之间的关系从原码出发求解反码和补码,学生会误以为原码是后两者的基础。原码的出发点是符号的表示(符号位),即用O表示正数,用1表示负数;反码和补码的出发点是减法的运算,即用两个正数的加法取代两个数的减法,因此反码和补码不能简单理解为由原码变换而成。
(2)原码、反码和补码符号位的差异。求解反码和补码过程中,保持原码符号位不变,学生会误以为原码、反码和补码的符号位相同。虽然符号位都表示数的正负,但是反码和补码与原码符号位的差别在于它们有权重(weight),如补码的符号位权重为—( 2n-l)。
2、术语定义
2.1完备性
国外教材关于术语定义从操作→方法→表示具有连贯性和一致性,国内教材术语定义(包括译著)存在混用和缺失的现象,表1对比了国内外教材涉及有符号数字存储的术语。
从表l可以看出,大部分国内教材对方法的术语(众一的补和二的补)缺乏明确的定义,即求解表示(众一的补表示和二的补表示)的过程。正因如此,部分译著将反码和补码与众一的补和二的补(参见1.2节定义)对应,另一部分译著将反码和补码与众一的补表示和二的补表示(参见1.2节定义)对应,导致方法和表示的术语冲突。由此可见,在定义表示的形式化描述时,更应该关注其求解方法的定义与内涵。
此外,国内教材对术语原码/原码表示法、反码/反码表示法和补码/补码表示法存在混用现象。具体而言,部分教材只使用原码、反码和补码,另一部分教材将原码/原码表示法、反码/反码表示法和补码/补码表示法混合使用(没有明确区分)。
2.2规范性
国外教材中的术语非常形象和直观。例如,众一的补中的“众一”表示二进制数中的每一位都用l减去这一位替代(与按位取反效果相同);二的补中的“二”表示基数2;两者中的“补”表明了它们之问的关系,即二的补等于众一的补加1。国内教材中的术语在认知上可能造成歧义。例如,原码中的“原”有原始的意思,学生容易误解为原码是反码和补码的基础。真值被定义为日常书写习惯中用+或-表示的数,英文中有与其冲突的术语truth value(同样翻译为真值),又称为逻辑值(logical value),是指相对于真的程度。在经典逻辑中,唯一可能的真值是真和假,模糊逻辑和其他形式的多值逻辑中会使用比真和假更多的真值。此外,国内网络百科将原码翻译为true form并不准确,对应英文术语应该是sign and magnitude representation。
3、数学本质
3.1必要性
形式化的描述是一把双刃剑,一方面能够用数学语言准确地描述概念本质,另一方面会因为过度抽象而增加学生理解的难度。部分国内教材对原码、反码和补码都给出了数学表达式。原码的定义本来非常直观且容易理解,原码用符号位表示数的正负,而符号位没有权重,不能直接参与运算。原码的数学表达式可能是一个由简变繁的过程且存在以下一些问题:这种表达式的实质和意义是什么?是否与原码的定义相关?原码没有权重或值的符号位是否能够通过算术运算来定义?将一个负数χ的原码定义为2n-1-X,即表示符号位的值为2n-l,相应的运算规则如何定义?
3.2准确性
国内教材的数学表达存在细微差异。国外教材:在众一的补表示中,一个负数χ被表示为其对应正数的众一的补,被定义为(2n-1)-(-X):在二的补表示中,一个负数x被表示为其对应正数的二的补(相对于2n的补),被定义为2n-(一x)。国内教材:一个负数x的反码和补码分别被定义为(2n-l)+x和2n+x。在计算层面,国内外教材的运算结果一致,因为- ( -x)=x,但在理解层面,“减去一个正数”与“加上一个负数”存在明显差异,失之毫厘,差之千里。计算机只能识别0和l组成的序列,负号并不存在。负数x可以表示为0-(-x),为了将减法转换为加法,需要求-x(正数)的算术负值。数学表达式(2n-l)+x和2n+x并不能准确描述这一过程。此外,部分国内教材直接用模运算定义反码和补码,模运算可以用于解释反码和补码如何工作,但并不能作为其正式定义,因为它不是相关概念的直接描述。
4、改进建议
国内外教材的差异可能会导致教学困惑和误区。为了澄清概念和消除误区,笔者提出以下几点改进建议。
(1)统一术语:建议用“取一个数的反码”和“取一个数的补码”分别对应“众一的补”和“二的补”;用“反码”和“补码”分别对应众一的补和二的补后的结果;用“原码表示”“反码表示”和“补码表示”分别对应“符号和数量表示”“众一的补表示”和“二的补表示”。
(2)修改方法:在讲解求解过程时,保持与补的方法(众一的补和二的补)一致,摒弃原码的基础上求解反码和补码的过程。
(3)更正定义:去掉原码的数学表达式,将反码和补码的数学表达式更正为(2n-l)一(一x)和2n-(-x)。
(4)更新百科:网络百科有时比教材更有影响力,因为许多学生遇到疑问都会在网上求答案。截止2014年11月28日,百度百科中反码和补码的浏览次数分别达到151 035和437 146,因此有必要规范和更新网络百科的相关内容,避免将教学误区扩大化。
5、结语
通过对比国内外教材和网络百科,笔者发现国内部分教材关于有符号数字存储的相关内容包括术语、概念和定义都有待进一步明确和清晰,建议统一术语,更正和修改定义和方法,更新网络百科相关内容,避免在教学过程中产生误区。