计算机中的有符号数有三种表示方法,即
原码、
反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和
数值域统一处理;同时,加法和减法也可以统一处理。
概念引入
为了深入理解补码的优越性,我们从生活中的钟表入手。
表盘上时针指向10点钟,而正确的时间是5点钟,要把时针拨回到5点钟有两种方法:第一种方法是将时针往回拨5个小时指向5点钟,第二种方法是将时针往前拨7个小时指向5点钟。用数学式表示出来,第一种方法为10-5=5;第二种方法为10+7=12+5=5,由于表盘上最大的数是12,当时间超过12点以后,12自动丢失,只保留减去12以后的余数5。从效果上来看,与是等价的,都使时针指向了5点,12称为模,“模”是指一个计数系统的进位基数。7是-5对模12的补数,也称为补码。该实例说明了对模12而言,减法运算可以通过加法运算来实现。这意味着,模确定以后,在舍弃进位的条件下,减去一个数可以通过加上该数的补码来实现,也意味着在电路中,减法运算可以通过加法电路来实现,从而简化了电路设计。
对于计算机,其概念和方法完全一样。n位计算机,设所能表示的最大数是11111111,若再加1成为100000000(9位),但因只有8位,最高位1自然丢失,又回到了00000000(8位),所以8位二进制系统的模为.在这样的系统中减法问题也可以化成加法问题。只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。
性质
以补码定义式为基础,沿
数轴列出典型的
真值、
原码与补码表示,可清楚了解补码的有关性质。
(1) 在补码表示中,最高位(符号位)表示数的正负,在形式上与原码相同,即 0正 1负。但补码的符号位是数值的一部分,由补码定义式计算而得。例如,负小数补码中为 1,这个 1是真值(负)加模 2后产生的。
(2) 在补码表示中,数 0只有一种表示,[+0]补 =[-0]补 =0.000……0.
(3) 负数补码表示的范围比原码稍宽,多一种数码组合。对于定点数,若为纯小数,表示范围为:,若为纯整数,表示范围为:。
(4) 将负数的真值与其补码在数轴上做一映射图,可以进一步看出,负数补码表示的实质是将负数映射到正数
域,因而可实现化减为加、简化运算的目的。
计算补码
对于正数,其补码与原码相同。
对于负数,通过数学公式求补码的过程较为复杂,不利于在计算机中的实现,有两种更简便实用的转换方法。
(2) 符号位保持不变,
尾数自低位向高位,第一个1及其以前的各位0保持不变,其他位按位取反。
补码计算原码
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个
正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个
负数,通过上述介绍的两种负数补码计算方式,可以得到补码的补码,即原码。
例:已知一个补码为11111001,则原码是10000111(-7)。
解:因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;再加1,所以是10000111。
数据溢出
(1) 用一位符号位判断溢出
对于加法,只有在正数加正数和负数加负数两种情况下才可能出现
溢出,符号不同的两个数相加是不会溢出的。
对于减法,只有在正数减负数或负数减正数两种情况下才可能出现溢出,符号相同的两个数相减是不会溢出的。
下面以机器字长为4位(含1位符号位)为例,说明机器是如何判断溢出的。
机器字长为4位的补码所对应的真值范围为[-8,+7],运算结果一旦超过这个范围即为溢出。下图列出了四种溢出情况。
由于减法运算在机器中是用加法器实现的,因此可得出如下结论:不论是作加法还是减法,只要实际参加操作的两个数(减法时即为被减数和“求补”以后的减数)符号相同,结果又与原操作数的符号不同,即为溢出。
(2) 用两位符号位判断溢出
特点
(1) 最高位为符号位,为0表示这个数是正数,为1表示这个数是负数。
(2) 对于正数,,即正数的补码与原码相同,且能表示的数值范围也相同。
(3) 对于负数,补码的值等于模减去该数的绝对值,再对照负数补码和反码的数学定义式可知,负数的补码等于该数的反码加1。
(4) 对于零,设,则,,0的表示是唯一的,解决了+0和-0的表示问题。
(5) 使用补码表示,可以将真值的减法运算变为机器中的加法运算,从而使
CPU 内部不再需要设计
减法器,简化了
CPU 的设计。
意义
补码“模”概念的引入、负数补码的实质、以及补码和真值之间的关系所揭示的补码符号位所具有的数学特征,无不体现了补码在计算机中表示数值型数据的优势,和原码、反码等相比可表现在如下方面 :
(1)解决了符号的表示的问题 ;
(2)可以将减法运算转化为补码的加法运算来实现,克服了原码加减法运算繁杂的弊端,可有效简化运算器的设计 ;
(3)在计算机中,利用电子器件的特点实现补码和真值、原码之间的相互转换,非常容易;
(4) 补码表示统一了符号位和数值位,使得符号位可以和数值位一起直接参与运算,这也为后面设计
乘法器除法器等运算器件提供了极大的方便。总之,补码概念的引入和当时运算器设计的背景不无关系,从设计者角度,既要考虑表示的数的类型(小数、整数、实数和复数)、数值范围和精确度,又要考虑数据存储和处理所需要的硬件代价。因此,使用补码来表示机器数并得到广泛的应用,也就不难理解了。
补充说明
在计算机中,有符号数有三种表示法:原码表示法、补码表示法、反码表示法。它们的特点如下。
(2) 当真值为正时,原码、补码和反码的表示形式均相同,即符号位用 “0” 表示,数值部分与真值相同。
(3) 当真值为负时,原码、补码和反码的表示形式不同,但其符号位都用 “1” 表示,而数值部分有这样的关系,即补码是原码的“求反加 1” ,反码是原码的“每位求反”。