1.1.2 微型计算机中数的表示方法
1.机器数与真值
数学中数的正和负用符号“+”和“-”表示,计算机中如何表示数的正和负呢?在计算机中,数据是存放在存储单元内的。每个存储单元是由若干二进制位组成的,其中每一数位或是0或是l,而数的符号或为“+”或为“-”,因此,可用一个数位来表示数的符号。在计算机中,规定用“0”表示“+”、用“1”表示“-”。用来表示数的符号的数位被称为“符号位”(通常为最高数位),于是数的符号在计算机中就被数码化了,但从表示形式上看,符号位与数值位没有区别。
设有两个数x1,x2:
x1=+1011011B,x2=-1011011B
它们在计算机中分别表示为
x1=01011011B,x2=11011011B
其中,带下画线部分为符号位,字长为8位。为了区分这两种形式的数,我们把机器中以数码形式表示的数称为机器数(x1=01011011B及x2=11011011B),把原来以一般书写形式表示的数称为真值(x1=+1011011B及x2=-1011011B)。
若一个数的所有数位均为数值位,则该数为无符号数;若一个数的最高数位为符号位,其他数位为数值位,则该数为有符号数。由此可见,同一个存储单元中存放的无符号数和有符号数所能表示的数值范围是不同的(例如,存储单元为8位,当它存放无符号数时,因有效的数值位为8位,该数的范围为0~255;当它存放有符号数时,因有效的数值位为7位,该数的范围为-128~+127)。
2.原码
对于一个二进制数,如果用最高数位表示该数的符号(0表示“+”,l表示“-”),其余各数位表示数值本身,则称这种表示方法为原码表示法。
若x=±x1x2…xn-1,则[x]原=±x0x1x2…xn-1。其中,x0为原机器数的符号位,它满足:
3.反码
如果[x]原=0x1x2…xn-1,则[x]反=[x]原。
如果[x]原=1x1x2…xn-1,则。
也就是说,正数的反码与其原码相同,而负数的反码是保持原码的符号位不变,各数值位按位取反。
4.补码
1)补码的引进
首先以日常生活中经常遇到的钟表对时为例来说明补码的概念,假定现在是北京时间8点整,而一只表却指向10点整。为了校正此表,可以采用倒拨和顺拨两种方法:倒拨就是逆时针减少2小时,把倒拨视为减法,相当于10-2=8,时针指向8;顺拨就是将时针顺时针拨10小时,时针同样指向8,把顺拨视为加法,相当于10+10=12(自动丢失)+8=8,其中自动丢失的数(12)就称为模(mod),上述加法称为“按模12的加法”,用数学式可表示为
10+10=12+8=8(mod12)
因时针转一圈会自动丢失一个数12,故10-2与10+10是等价的,称10和-2对模12互补,10是-2对模12的补码。引进补码概念后,就可以将原来的减法10-2=8转化为加法10+10=12(自动丢失)+8=8(mod12)了。
2)补码的定义
通过上面的例子不难理解计算机中负数的补码表示法。设寄存器(或存储单元)的位数为n,则它能表示的无符号数最大值为2n-l,逢2n进1(2n自动丢失)。换句话说,在字长为n的计算机中,数2n和0的表示形式一样。若机器中的数以补码表示,则数的补码以2n为模,即
[x]补=2n+x(mod2n)
若x为正数,则[x]补=x;若x为负数,则[x]补=2n+x=2n-|x|,即负数x的补码等于2n(模)加上其真值或减去其真值的绝对值。
在补码表示法中,0只有一种表示形式,即0000…0。
3)求补码的方法
根据上述介绍可知,正数的补码等于原码。下面介绍求负数补码的3种方法。
(1)根据真值求补码。
根据真值求补码就是根据定义求补码,即
[x]补=2n+x=2n-|x|
负数的补码等于2n(模)加上其真值,或者等于2n(模)减去其真值的绝对值。
(2)根据反码求补码(推荐使用方法)。
[x]补=[x]反+1
(3)根据原码求补码。
负数的补码等于其反码加l,这也可以理解为负数的补码等于其原码各位(除符号位外)取反并在最低位加1。如果反码的最低位是1,则它加1后就变成0,并产生向次低位的进位。如果反码的次低位也为l,则它同样变成0,并产生向其高位的进位(这相当于在传递进位)。以此类推,进位一直传递到第1个为0的位为止,于是得到这样的转换规律:从反码的最低位起直到第一个为0的位之前(包括第一个为0的位),一定是1变0,第一个为0的位以后的位都保持不变。由于反码是由原码求得的,所以可得从原码求补码的规律为:从原码的最低位开始到第1个为1的位之间(包括此位)的各位均不变,此后各位取反,但符号位保持不变。
特别要指出的是,在计算机中凡是带符号的数一律用补码表示且符号位参加运算,其运算结果也用补码表示,若结果的符号位为“0”,则表示结果为正数,此时可以认为该结果是以原码形式表示的(正数的补码即原码);若结果的符号位为“l”,则表示结果为负数,此时可以认为该结果是以补码形式表示的,若用原码来表示该结果,还需要对结果求补(除符号位外“取反加l”),即
[[x]补]补=[x]原