3.2.1 定点数的编码表示

3.2.1 定点数的编码表示

在计算机系统中只能表示0和1,但是现实世界中,数字还有正负之分。因此,在计算机系统中,正负也要用0和1来表示。用0和1来表示数字的正负的方法称为符号数字化,也称为编码。

目前使用最多的定点数的编码表示方法有原码、反码、补码和移码。这种计算机内部能识别的数通常被称为机器码。其真正的值称为真值。由于计算机的特性,机器码必须是二进制的一串数字。例如-6用8位补码表示为11111010,其中11111010称为真值为-6的数的机器码。由于机器码一定只有0和1组成,在数位较多时表示不方便,因此一般情况下用十六进制来表示。

1.原码表示法

整数的符号位为0,负数的符号位为1,其他位保持不变,用这样的表示方法来表示的数称为原码。

【例3.10】 当机器码二进制数长为8位时

X=+1011011 [X]原码=01011011

Y=-1011011 [Y]原码=11011011

原码表示的整数范围是-(2n-1-1)~+(2n-1-1),其中n为机器码的位数。因此,8位二进制整数原码的表示范围为-127~+127。16位二进制整数原码的表示范围为-32767~+32767。

由上例可以看出,原码表示法的优点是直观、简单,真值与原码之间的转换非常简单,运算过程也十分简便。但是原码表示法的缺点也很明显,0的表示会产生歧义,为了解决这一问题,人们又提出了反码和补码。

2.反码表示法

对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。

【例3.11】 当机器码二进制数长为8位时

X=+1011011 [X]原码=01011011 [X]反码=01011011

Y=-1011011 [Y]原码=11011011 [Y]反码=10100100

可见,负数的反码与原码之间区别很大。反码是常用于求补码的中间形式。反码的表示范围与原码相同。

3.补码表示法

正数的补码与其原码相同,负数的补码为其反码在最低位加1。

引入补码以后,计算机中的加减运算都可以统一化为补码的加法运算,其符号位也参与运算,并且0的表示也唯一。对于8位二进制来说,+0的补码为00000000,-0的补码为100000000,由于溢出,最高位舍去,因此-0的补码还是00000000。可见,补码解决了0的表示歧义问题。

【例3.12】 当机器码二进制数长为8位时

X=+1011011 [X]原码=01011011 [X]反码=01011011 [X]补码=01011011

Y=-1011011 [Y]原码=11011011 [Y]反码=10100100 [Y]补码=10100101

补码表示的整数范围是-2n-1~+(2n-1-1),其中n 为机器码的位数。因此,8位二进制整数补码的表示范围为-128~+127。16 位二进制整数补码的表示范围为-32768~+32767。当运算结果超过这个范围就称为溢出。

补码可以用加法来实现减法运算。在介绍其原理之前,先介绍一下模运算的概念。模运算是一个运算系统,模是指这个运算系统中可以取得的所有值的个数。比如,一年有365天,这个系统的模就为365;一个星期有7天,这个系统的模为7。

钟表是一个简单的模运算系统,以时针来看,它的模为12。假如时针现在的指向是10点,要将它拨到5点,则可以有下面两种方法:

(1)逆时针拨5格:10-5=5。

(2)顺时针拨7格:10+7=17,17mod12=5(模为12)。

因此,在模为12的运算系统中,10-5和10+7的效果的一样的,我们称5和7互为补数,也称补码。

由此钟表的例子可见,对于一个模确定的运算系统,数N 减去一个小于模的数A,相当于N 加上-A 的补码。这就是补码用加法实现减法的原理。

因此,在计算机系统中,n位二进制数的运算,其模就是2n

【例3.13】 二进制的位数是8,求N=-1100011的补码。

解:N=-1100011 [N]原码=11100011 [N]反码=10011100 [N]补码=10011101。

4.移码表示法

移码常用来比较大小,一般会把浮点数的阶码用移码表示,如果把数值用移码表示出来,我们可以一眼看出它们的大小。这样很容易判断阶码的大小,移码可用于简化浮点数的乘除法运算,只要将其补码的符号位取反即可得到移码。