关于原码反码补码的一些思考


原码
原码就是其本身
[+1]原 = 0000 0001
[-1]原 = 1000 0001


反码
对于正数来说,反码就是其本身
对于负数来说,反码是符号位不变,其他所有位取反
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反


补码
对于正数来说,补码就是其本身
对于负数来说,补码是反码再加1
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补




二为什么要有原码反码补码
计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都一样的:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
 但是对于负数来说,原码, 反码和补码确是截然不同:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
 
这就带来了一个问题,既然原码才是被人脑直接识别的表示方式, 为何还会有反码和补码呢?

这里就会牵扯到一些其他的问题了

人脑可以知道第一位是符号位,但是对于计算机来说, 加减乘数本身就已经是最基础的运算, 所以要设计的尽量简单. 而事实上,要让计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂!于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.

但是这样又出现了新的问题,如
计算十进制的表达式: 1-1=0
计算二进制的表达式:
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2 
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果很显然是不正确的.这也就是为何计算机内部不使用原码表示一个数原因


为了解决原码做减法的问题, 出现了反码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
 
发现用反码计算减法, 结果部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.
于是补码的出现, 解决了0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示


总的来说,其实他们类似于时钟问题
回拨1小时 = 前拨11小时
回拨3小时 = 前拨9小时
回拨5小时= 前拨7小时


在计算机运算的过程中,我们先把数据由原码转为补码然后进行计算,得到补码计算结果后,在进行原补码转换(就是在进行一次补码运算,补码的补码是原码),得到最后的源码运算结果


四 最后总结
他们主要是解决计算机运算的问题,而诞生的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值