原码,反码,补码及运算
一、定义
  1.原码
  正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。用这样的表示方法得到的就是数的原码.
  【例2.13】当机器字长为8位二进制数时:
            X=+1011011                  [X]原码=01011011
            Y=-1011011                [Y]原码=11011011
            [+1]原码=00000001              [-1]原码=10000001
            [+127]原码=01111111            [-127]原码=11111111
  原码表示的整数范围是:
  -(2n-1-1)~+(2n-1-1),其中n为机器字长。
  则:8位二进制原码表示的整数范围是-127~+127
      16位二进制原码表示的整数范围是-32767~+32767
  2.反码       
  对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反.
【例2。14】当机器字长为8位二进制数时:
  X=+1011011 [X]原码=01011011  [X]反码=01011011
  Y=-1011011 [Y]原码=11011011  [Y]反码=10100100
  [+1]反码=00000001    [-1]反码=11111110
  [+127]反码=01111111    [-127]反码=10000000
  负数的反码与负数的原码有很大的区别,反码通常用作求补码过程中的中间形式。        反码表示的整数范围与原码相同。
  3.补码
  正数的补码与其原码相同,负数的补码为其反码在最低位加1.
    引入补码以后,计算机中的加减运算都可以统一化为补码的加法运算,其符号位也参与运算。
  【例2。15】(1)X=+1011011 (2) Y=-1011011
  (1)根据定义有: [X]原码=01011011        [X]补码=01011011
  (2) 根据定义有: [Y]原码=11011011        [Y]反码=10100100
  [Y]补码=10100101
  补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。
  则:8位二进制补码表示的整数范围是-128~+127(-128 表示为10000000,无对应的原码和反码)
      16位二进制补码表示的整数范围是-32768~+32767
  当运算结果超出这个范围时,就不能正确表示数了,此时称为溢出。
所以补码的设计目的是:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则。
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
  4.补码与真值之间的转换
  正数补码的真值等于补码的本身;负数补码转换为其真值时,将负数补码按位求反,末位加1,即可得到该负数补码对应的真值的绝对值。
  【例2。16】[X]补码=01011001B,[X]补码=11011001B,分别求其真值X。
  (1)[X]补码代表的数是正数,其真值:
                                              X=+1011001B
                                                =+(1×26+1×24+1×23+1×20)
                                                =+(64+16+8+1)
                                                =+(89)D
  (2)[X]补码代表的数是负数,则真值:
                                              X=-([1011001]求反+1)B
                                                =-(0100110+1)B
                                                =-(0100111)B
                                                =-(1×25+1×22+1×21+1×20)
                                                =-(32+4+2+1)
负数二进制补码运算法则                                                =-(39)D
二、补码加、减运算规则
1、运算规则
[X+Y]补= [X]补+ [Y]补
[X-Y]补= [X]补+ [-Y]补
若已知[Y]补,求[-Y]补的方法是:将[Y]补的各位(包括符号位)逐位取反再在最低位加1即可.
例如:[Y]补= 101101 [-Y]补= 010011
2、溢出判断,一般用双符号位进行判断:
符号位00 表示正数 11 表示负数
结果的符号位为01时,称为上溢;为10时,称为下溢
例题:设x=0.1101,y=-0.0111,符号位为双符号位
用补码求x+y,x-y
[x]补+[y]补=00 1101+11 1001=00 0110
[x-y]补=[x]补+[-y]补=00 1101+00 0111=01 0100
结果错误,正溢出
数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制.
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8。即字长为1byte,原码能表示数值的范围为

(—127~-0 +0~127)共256个.

有了数值的表示方法就可以对数进行算术运算。但是很快就发现用带符号位的原码进行乘除
运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits

( 1 ) 10— ( 1 )10 = ( 1 )10 + ( —1 )10 = ( 0 )10

(00000001)原 + (10000001)原 = (10000010)原 = ( —2 ) 显然不正确.

因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码。反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:

( 1 )10 — ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10

(00000001) 反+ (11111110)反 = (11111111)反 = ( —0 ) 有问题.

( 1 )10 - ( 2)10 = ( 1 )10 + ( —2 )10 = ( -1 )10


(00000001) 反+ (11111101)反 = (11111110)反 = ( —1 ) 正确

问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大)。

于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(—128)代替了(-0),所以补码的表示范围为:

(—128~0~127)共256个。

注意:(-128)没有相对应的原码和反码, (—128) = (10000000) 补码的加减运算如下:

( 1 ) 10— ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10

(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确

( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( —1 )10

(00000001) 补+ (11111110) 补= (11111111)补 = ( —1 ) 正确

所以补码的设计目的是:

使符号位能与有效值部分一起参加运算,从而简化运算规则。

使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些你应该对原码、反码、补码有了新的认识了吧
在计算机内,定点数有3种表示法:原码、反码和补码
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0"表示正,“1"表示负,其余位表示数值的大小。
  反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外.
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1.
1、原码、反码和补码的表示方法
(1)    原码:在数值前直接加一符号位的表示法。
例如:      符号位  数值位
[+7]原=  0    0000111  B
[-7]原=  1    0000111  B
    注意:a. 数0的原码有两种形式:
            [+0]原=00000000B    [—0]原=10000000B
          b。 8位二进制原码的表示范围:—127~+127
(2)反码:
    正数:正数的反码与原码相同。
    负数:负数的反码,符号位为“1”,数值部分按位取反。
例如:    符号位 数值位
    [+7]反=  0  0000111  B
    [-7]反=  1  1111000  B
注意:a。 数0的反码也有两种形式,即
        [+0]反=00000000B
        [- 0]反=11111111B
      b。 8位二进制反码的表示范围:-127~+127
(3)补码的表示方法
1)模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=—10+12=2).因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为28=256。在计算中,两个互补的数称为“补码".
2)补码的表示:
    正数:正数的补码和原码相同。
    负数:负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
例如:      符号位 数值位
      [+7]补=  0  0000111  B
      [—7]补=  1  1111001  B
补码在微型机中是一种重要的编码形式,请注意:
a.            采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化.正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。采用补码进行运算,所得结果仍为补码.
b。            与原码、反码不同,数值0的补码只有一个,即      [0]补=00000000B。
c.            若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。
2.原码、反码和补码之间的转换
由于正数的原码、补码、反码表示方法均相同,不需转换。
在此,仅以负数情况分析。
(1)    已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码。
解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1  0  1  1  0  1  0  0  原码
1  1  0  0  1  0  1  1  反码,符号位不变,数值位取反
                    1  +1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。