原码、反码、补码

原码、反码、补码 在线计算:http://www.atoolbox.net/Tool.php?Id=952

1、计算机中都是用 "补码" 表示

在计算机系统中,数值一律用 补码 来表示(存储)。

主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

  • 正数原码、反码、补码 " 相同
  • 负数用补码表示。如果 负数也用原码表示,对于 8位二进制来说,表示范围就只有255个数,  -128无法表示。

8位 二进制 的 表示法的数据范围:

原码: -127 ~ 127                  1 111 1111   到  0 111 1111
反码: -127 ~ 127
补码: -128 ~ 127

2、原    码

最高位:是0表示正数,是1表示负数

最高位 做为 符号位0代表正,1代表负,其余各位代表数值本身的绝对值

+7 的 原码:0  000  0111
 -7 的 原码:1  000  0111

3、反    码

一个数如果值为正,那么反码和原码相同
一个数如果为负,那么符号位为1,其他各位与原码 " 数值位 "  相反。

+7 的 反码:0  000 0111
 -7 的 反码:1  111 1000    

解释:要得到 -7 的反码,首先的看 +7 的数值位,+7 的数值位是 000 0111,数值位取反得到 111 1000,然后在添加上 符号位,即可得到 -7 的反码为 1 111 1000

3.1 +0 和 -0 

按照反码规则,这时就出现了 +0 和 -0 :

+0 和 -0 的 原码 :

  • +0 原码:0  000  0000
  • -0 原码:1  000  0000

+0 和 -0 的 反码

  • +0 反码:0  000  0000
  • -0 反码:1  111  1111

4、补    码

原码、反码 " 都不利于计算机的运算。
比如:原码表示的 7 和 -7 相加,还需要判断符号位。同时只有一个 0,但是0的反码却分为 +0 和 -0

补码 的 补码 就是 原码,有点负负得正的意思。

补码运算:

  • 正数:" 原码,反码、补码 " 都相同
  • 负数的补码 是 负数原码的数值位取反,然后带上符号位加 1。( 负数的补码:符号位不动,其他位求反,最后整个数 + 1,得到原码

    -7 的补码:=
            1 000  0111    (原码)
            1 111  1000    (反码)       符号位不变,原码的数值位 000  0111 取反 得到 111  1000
            1 111  1001    (补码)

解决 +0 和 -0 问题

求负数的补码时,取反后,加1时 需要符号位参与运算

+0 的 补码 为 00000000
-0 的 补码 也是 00000000

原码反码补码
0+0 0 000 0000 0 000 0000 0 000 0000
-0 1 000 0000 1 111 1111 1 111 1111 + 1 0 000 0000  ( "最高位的进位" 被舍弃 )说明:符号位不变,其他位取反得到 1111 1111,然后加 1(符号位参与运算,即整个数加1) 得到补码 0000 0000 ,所以 +0 和 -0 补码一样 
110 000 00010 000 00010 000 0001
-1-11 000 00011 111 11101 111 1110 + 1  得到补码  1 111 1111
1271270 111 11110 111 11110 111 1111
-127-1271 111 11111 000 00001 000 0000 + 1  得到补码  1 000 0001 

当 +0 和 -0 补码统一都为 0000 0000 后,还有一个 1000 0000 没有对应数字,于是规定 -128 的补码是 1000 0000,可以理解为是一个特殊性。

可以看到 -128 没有 原码、反码,所以是直接规定的 -128 的补码是 1000 0000

这样规定后,负数的补码在机器中就好算了。在约定的范围内( -128 --- +127,对16位32位64位等扩大范围)
先将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位),对该二进制数进行取反加一操作就得到负数的补码了
-128 绝对值是 128
128的二进制表示为:
1000 0000
取反
0111 1111
加1
1000 0000
这就是-128的补码
这种办法算出的结果符合 “规定值”,规定而已。

4.2 补码运算(加减)

求一个负数的补码时,取反后,加1时需要符号位参与运算

补码运算(加减)也需要符号位参与运算

补码运算要注意的问题:

  • 1. 补码运算时,其符号位与数值部分一起参加运算。
  • 2. 补码的符号位相加后,如果有进位出现,要把这个进位舍去(自然丢失)。
  • 3. 用补码运算,其运算结果亦为补码。在转换为真值时。
            若符号位为0,数位不变;
            若符号位为1,应将结果求补才是其真值。

-7 的补码:=
            1 000  0111    (原码)
            1 111  1000    (反码)
            1 111  1001    (补码)

两个补码运算(加减)符号位参与运算
        +7 补码  0000  0111
        -7 补码  1111  1001

        +7 的补码 加 -7 的补码

                0000   0111
       +       1111   1001
------------------------------
           1   0000   0000      ( 符号位进位舍弃 )

因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉

溢出及补码溢出的判断
无论采用何种机器数,只要运算的结果大于数值设备所能表示数的范围,就会产生溢出。  溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。
由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。

 

补码运算

  用补码进行运算,减法可以通过加法实现

  7-6=1    (7 的补码 和 -6 的补码 相加)

  7 的补码 :0000  0111

 -6 的补码: 1111  1010

               = 1 0000 0001      

  最后的进位溢出(总共 8 位,这得到 9位,所以第 9 位舍弃),所以舍弃,得到  0000 0001 ,表示 1

  -7+6 = -1

  -7的补码和6的补码相加:11111001 + 00000110 = 11111111

  11111111 是 -1 的补码

补码的计算方法

示例:某数字设备用五位二进制表示数,计算  
     (1)9+3  (2)-9-3  (3)9+12  (4)-9-12
  解:(1)[+9]补+[+3]补= 01001+ 00011 = 01100 = +12 正确;
         (2)[-9]补+[-3]补= 10111+ 11101 = 110100 = 10100(符号位进位自然丢失),            其真值为-1100 = -12正确;
         (3)[+9]补+[12]补= 01001 + 01100 = 10101 其真值为-1011 =-11错误,产生了溢出;
         (4)[-9]补+[-12]补 = 10111+10100 = 101011 其真值为01011= +11 错误,产生了溢出。
(1)、(2)两题结果均正确,查其最高位和次高位的进位位,不是均无进位产生,就是均产生进位;(3)、(4)两题结果均错误,查其最高位和次高位的进位位,只有一位产生了进位。此即为判断机器是正常进位还是溢出的基本依据,在微型机中可用异或电路来实现上述的判断。

5、移    码

正数

正数(定点小数、定点整数):
          原码,补码,反码相同;
          移码只要在原码的最高位+1就可以了
    

负数

负数(定点小数、定点整数)负数补码求法:也就是 “绝对值的原码取反加1”
        反码:保持原码符号位不变,数值位取反
        补码:反码的最低位+1 (即 取反加1,符号位也运算)
        移码:与补码的符号相反,数值位保持不变
     -1 原码:1000 0001
     -1 反码:1111 1110  (符号位不变,数值位取反)
     -1 补码:1111 1111  (-1的反码加1:1111 1110 +1 = 1111 1111)

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值