一篇看懂二进制补码

计算机原理中,很多同学经常被补码搞晕,这里做一个推导与理解,方便入坑的同学出坑。计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位(一般是最高位)都是用0表示“正”,用1表示“负”,而数值位。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理 。
为什么是计算机中采用补码?
这里用8位二进制表示及运算举例说明(先说原码和反码):
1)原码表示

十进制x = +8 的8位二进制表示方法:00001000,-8的表示:10001000

2)反码表示(正数的反码就是其原码; 负数的反码是将原码中除符号位以外的每一位取反)(注意:反码并非每位取反)

十进制 +8 的8位二进制反码表示:00001000,-8的表示:11110111

3)补码表示(正数原码就是补码,负数的补码为反码末位加1)

十进制x = +8 的8位二进制原码表示:00001000, [x]补表示: 00001000
十进制x = -8 的8位二进制原码表示:10001000, [x]补表示: 11111000

注:正数对原码、补码、反码二进制表示一样;负数补码表示反码加1,还有另外一个算法:该数绝对值的补码按位取反,然后对整个数加1,后面证明会用到,不要混淆

4) 先来研究计算机内部可以不可以不用补码来计算:
正数二进制的加入无需推导,这里推导二进制减法:如16 + (-8) = ?
16的8位二进制表示是 00010000,按照正常的二进制加法(把符号位加入)表示就要写成:

00010000(16原码)

+10001000(-8原码)
---------
  10011000 = -24 (很明显答案是错误的,很明显不用补码 存储计算是错误的结果)

下面看下8位2进制表示的补码计算:

00010000  (16补码)

+ 11111000 (-8补码)
---------
100001000 = 8(超过8位的部分溢出)和明显答案正确

结论是:计算中加减运算是利用补码来进行储存与运算的

5)关于补码的本质是(借由0 - 8 = -8 整个计算过程来研究二进制的减法)

100000000
- 00001000
--------- 
11111000 (-8 = 10001000的补码)

向前一位借1,但是8位二进制计算机储存会溢出是无法表示的,可以换两个8位二进制来 表示:100000000(9位) = 11111111(8位) + 00000001(8位)

11111111

- 00001000
--------- 
11110111
+00000001
--------- 
11111000 (-8 = 10001000的补码)

5)这里是举例求证,那么如何推导:
需要证明结论是对于8位二进制数X、Y,求证当X为正、Y为正、且8位二进制Z = X - Y,那么Z = X + (-Y)补码。

因为    (- Y) 补码  = 0- Y =  11111111- Y + 00000001 
            Z  = X - Y

所以

           Z  =  X - Y
             =  X + (0 -Y) 
             =  X + (11111111 + 1 -Y)  = X + (-Y)补码

猜你喜欢

转载自blog.51cto.com/13238147/2467640
今日推荐