1. 机器数和真值
二进制数有正负之分,如N1=+0.101101,N2=-0.101101,则N1是个正数,N2是个负数。机器不能直接把符号“+”、“-”表示出来,为了能在计算机中表示正负数,必须引入符号位,即把正负符号也用1位二进制数码来表示。把符号位和数值位一起编码来表示相应的数的表示方法包括:原码、补码、反码、移码等。
为了便于在计算机中表示,同时又便于与实际值相区分,在此首先引入机器数和真值的概念。
机器数 用二进制数“0”或“1”来表示数的符号,“0”表示正号,“1”表示负号,且把符号位置于该数的最高数值位之前,这样表示的数称为机器数(或称机器码),即把符号位和数值位一起编码来表示的数就是机器数。
真值 一般书写中用“+”、“-”来表示数的符号,这样表示的数称为真值。
例如:N1 = +0.101101,N2 = -0.101101,这是真值,表示成机器数(以原码为例)就是[N1]原= 0.101101,[N2]原 = 1.101101。
机器数有原码、补码、反码和移码四种表示形式。下面以整数为例说明原码、补码、反码和移码的表示方法。
2. 原码
符号位为0表示正数,为1表示负数,数值部分用二进制数的绝对值表示的方法称为原码表示法,通常用[X]原表示X的原码。
例如,要表示+59和-59的原码。假设机器数的位数8位(即机器的字长为8位),最高位是符号位,其余7位是数值位,那么,+59和-59的原码分别表示为:
[+59]原=00111011 [-59]原=10111011
写成一般式则为:
正数的原码 [X]原=X (0<X<2n-1)
负数的原码 [X]原=2n-1-X (-2n-1<X<0)
注意:0的原码有两个值,有“正零”和“负零”之分,机器遇到这两种情况都当作0处理。
[+0]原=00000000 [-0]原=10000000
原码的表示方法简单易懂,与真值转换方便,但在进行加减法运算时,符号位不能直接参加运算,而是要分别计算符号位和数值位。当两数相加时,如果是同号,则数值相加;如果是异号,则要进行减法运算。而在进行减法运算时,还要比较绝对值的大小,然后用大数减去小数,最后还要给运算结果选择恰当的符号。
为了解决这些问题,人们引进了数的补码表示法。
3. 补码
什么是补码?我们先用日常生活中的实例来进行说明。假如现在时间是7点,而你的手表却指向了9点,如何调整手表的时间?有两种方法拨动时针,一种是顺时针拨,即向前拨动10个小时;另一种是逆时针拨,即向后拨2个小时。从数学的角度可以表示为:
(9+10) -12=19-12=7
或 9-2=7
可见,对钟表来说,向前拨10个小时和向后拨2个小时的结果是一样的,减2可以用加10来代替。这是因为钟表是按12进位的,12就是它的“模”。对模12来说,-2与+10是“同余”的,也就是说,-2与+10对于模12来说是互为补数的。
计算机中的加法器是以2n为模的有模器件,因此可以引入补码,把减法运算转换为加法运算,以简化运算器的设计。
补码的定义:把某数X加上模数K,称为以K为模的X的补码。
[X]补=K+X
因此,正数的补码的最高位为符号“0”,数值部分为该数本身;负数的补码的最高位为符号“1”,数值部分为用模减去该数的绝对值。
通过用模2n减去某数的绝对值的方法来求某数的补码比较麻烦,求一个二进制数的补码的简便方法是:正数的补码与其原码相同;负数的补码是符号位不变,数值位逐位取反(即求其反码),然后在最低位加1。
例如,[+59]补=[+59]原=00111011,而[-59]原=10111011,因此,[-59]补= 11000100+1 = 11000101。
注意:0的补码只有一种形式,就是n位0。
采用补码表示法进行加减法运算,比原码运算方便多了,符号位可以和数值位一起参加运算,而且不论数是正还是负,计算机总是做加法,减法运算可转换为加法运算。
4. 反码
引入反码的目的是便于求负数的补码。
正数的反码与原码相同,负数的反码是符号位不变,数值位逐位取反。
例如:[+59]反=[+59]原=00111011,而[-59]原=10111011,因此,[-59]反=11000100。
注意:0的反码也有两个,[+0]反=00000000,[-0]反=11111111
在计算机中,求一个数的反码很容易,因此,求一个数的补码也就易于实现。
采用补码运算,计算机的控制线路较为简单,所以,目前大多数计算机均采用补码存储、补码运算,其运算结果仍为补码形式。
综上所述,在n位机中,用n位二进制数补码表示一个带符号的整数时,最高位为符号位,后面n-1位为数值部分。n位二进制数补码表示的范围为-2n-1~+2n-1-1。例如,在8位机中,补码表示的范围为-128~+127。
表2-2列出了8位二进制数码在各种表示形式下的对应真值。
表2-2 8位二进制数的各种表示方法
5)移码
移码也称为增码或偏码,常用于表示浮点数中的阶码。
移码可由补码求得,只要把补码的符号位取反就得到了移码。
转载自:http://share.onlinesjtu.com/mod/tab/view.php?id=173