关于真值、原码、补码、反码、移码知识点的总结

关于真值、原码、反码、补码、移码知识点的说明

一、首先介绍两个概念性(比较傻瓜式的)的问题

1、机器数

一个数在计算机中的二进制表示形式叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0,负数为1。比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 10000011 就是机器数。

2、真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值13110000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001的真值 = +000 0001 = +11000 0001的真值 = –000 0001 = –1

二、 原码、反码、补码、移码相关问题

原码:
如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。

例如: X=+101011
, [X]原=
00101011    X=-101011
, [X]原= 10101011
位数不够的用0补全。

PS:正数的原、反、补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0。

反码:
知道了什么是原码,那反码就更是张飞吃豆芽——小菜一碟了。知道了原码,那么你只需要具备区分0跟1的能力就可以轻松求出反码,为什么呢?因为反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。

例如:X=-101011
, [X]原= 10101011,[X]反=11010100
补码:

补码也非常的简单就是在反码的基础上按照正常的加法运算加1。

例如:X=-101011
, [X]原= 10101011 ,[X]反=11010100,[X]补=11010101

PS:0的补码是唯一的,如果机器字长为8那么[0]补=00000000。

移码:

移码最简单了,不管正负数,只要将其补码的符号位取反即可。

例如:X=-101011
, [X]原= 10101011 ,[X]反=11010100,[X]补=11010101,[X]移=01010101

三、下面举例说明(或者表示方法):

1)原码表示法

    原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。

    例如,X1= 1010110 X2= 1001010

其原码记作:

     X1]原=[1010110]=01010110

     X2]原=[1001010]=11001010

2)反码表示法

    机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。

    例如:X1= 1010110X2= 1001010

        X1]原=01010110

         [X1]=X1]原=01010110

         [X2]=11001010

         [X2]=10110101

反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。

3)补码表示法    机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。

      例如,[X1]=1010110 [X2]= 1001010

            [X1]=01010110

            [X1]=01010110

          [X1]=[X1]=01010110

            [X2]= 11001010

            [X2]=10110101110110110

4)移码:

移码最简单了,不管正负数,只要将其补码的符号位取反即可。

例如:  X=
    -101011 

[X]= 10101011 

[X]= 11010100

[X]= 11010101

 [X]= 01010101

四、有些比较特殊的地方

如果是在字长为8位的计算机上,
+0的原码是00000000 -0的原码是10000000
+0的反码是00000000 -0的反码是11111111
+0和-0的补码均为00000000

五、延伸(感兴趣的童鞋可以看看)

补码加、减运算规则

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
结果错误,正溢出

原码一位乘的实现:

设X=0.1101,Y=-0. 1011,求X*Y
解:符号位单独处理, x符+ y符
数值部分用原码进行一位乘,如下图所示:
  

  高位部分积  低位部分积/乘数 说明
       0 0 0 0 0 0    1
0 1 1     起始情况
+) 0 0 1 1 0
1     乘数最低位为1,+X
--------------------------------------------------------------------------------
 
       0 0 1 1 0
1      
       0 0 0 1 1 0   1 1 0 1
1(丢) 右移部分积和乘数
  +) 0 0 1 1 0 1     乘数最低位为1,+X
 
--------------------------------------------------------------------------------
      
       0 1 0 0 1
1       
       0 0 1 0 0 1   1 1 1
0  1(丢) 右移部分积和乘数
  +) 0 0 0 0 0 0     乘数最低位为0,+0
 
--------------------------------------------------------------------------------
      
       0 0 1 0 0 1       
       0 0 0 1 0 0   1 1 1 1
0(丢) 右移部分积和乘数
  +) 0 0 1 1 0 1     乘数最低位为1,+X
 
--------------------------------------------------------------------------------
      
       0 1 0 0 0
1       
       0 0 1 0 0 0  1 1 1 1 1(丢) 右移部分积和乘数    

原码一位除的实现:一般用不恢复余数法(加减交替法)

  部分积 低位部分积 附加位 操作说明
       0 0 0 0 0
0     1 0 1 1     起始情况
+) 0 0 0 0 0
0     乘数最低位为1,+X
 
--------------------------------------------------------------------------------
      
       0 0 0 0 0
0      
       0 0 0 0 0 0   1 1 0 1
1(丢) 右移部分积和乘数
  +) 1 1 0 0 1 1     乘数最低位为1,+X
 
--------------------------------------------------------------------------------
      
       0 1 0 0 1
1       
       0 0 1 0 0 1   1 1 1
0  1(丢) 右移部分积和乘数
  +) 0 0 0 0 0 0     乘数最低位为0,+0
 
--------------------------------------------------------------------------------
      
       0 0 1 0 0
1       
       0 0 0 1 0 0   1 1 1 1
0(丢) 右移部分积和乘数
  +) 0 0 1 1 0 1     乘数最低位为1,+X
 
--------------------------------------------------------------------------------
      
       0 1 0 0 0
1       
       0 0 1 0 0 0  1 1 1 1 1(丢) 右移部分积和乘数

六、浮点运算与浮点运算器

一、浮点数的运算规则
1、浮点加减法的运算步骤
设两个浮点数 X=Mx※2Ex Y=My※2Ey
实现X±Y要用如下5步完成:
①对阶操作:小阶向大阶看齐
②进行尾数加减运算
③规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是
001×××…×× 或110×××…××的形式
若不符合上述形式要进行左规或右规处理。

④舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进行舍入,以确保精度。
⑤判结果的正确性:即检查阶码是否溢出
若阶码下溢(移码表示是00…0),要置结果为机器0;
若阶码上溢(超过了阶码表示的最大值)置溢出标志。

例题:假定X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制) ?? 计算X+Y;
解:[X]浮: 0 1 010 1100110
    [Y]浮: 0 0 110 1101101
            符号位 阶码 尾数

第一步:求阶差: │ΔE│=|1010-0110|=0100
第二步:对阶:Y的阶码小, Y的尾数右移4位
        [Y]浮变为 0 1 010 0000110 1101暂时保存
第三步:尾数相加,采用双符号位的补码运算
    00 1100110
   +00 0000110
    00 1101100
第四步规格化:满足规格化要求
第五步:舍入处理,采用0舍1入法处理
故最终运算结果的浮点数格式为: 0 1 010 1101101,
即X+Y=+0. 1101101*210

2、浮点乘除法的运算步骤
①阶码运算:阶码求和(乘法)或阶码求差(除法)
    即  [Ex+Ey]移= [Ex]移+ [Ey]补
        [Ex-Ey]移= [Ex]移+ [-Ey]补

②浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理
例题:X=0 .0110011*211,Y=0.1101101*2-10
求X※Y
解:[X]浮: 0 1 010 1100110
    [Y]浮: 0 0 110 1101101
第一步:阶码相加
[Ex+Ey]移=[Ex]移+[Ey]补=1 010+1 110=1 000
1 000为移码表示的0
第二步:原码尾数相乘的结果为:
0 10101101101110
第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。
第四步:舍入处理:按舍入规则,加1进行修正
所以 X※Y= 0.1010111※2+000

 

您可以选择一种方式赞助本站

支付宝转账赞助