计算机码制--深入理解 原码、反码、补码

关于原码、反码、补码的学习是很久远以前的事情了,感觉规则不难,各种关于计算机码制的博客也非常多,但是自己始终没有真正理解计算机中使用补码的真正用途,可能是自己智商有限。在这篇博客中我把自己对计算机码制的理解记录下来。

1.计算机码制的基本规则

对于有符号数:正数原码=反码=补码;负数原码(最左边的bit来标识符号0是正数,1是负数),反码=原码取反(除去符号位),补码=反码+1;特殊情况:正负0,正0的二进制表示是0000|0000,补码是它本身0000|0000,负0的原码是1000|0000,按照补码规则负0的补码为0000|0000,可见正0和负0的补码是一样的。还有一种特殊情况是补码为1000|0000,我们好像找不到哪个数的补码是1000|0000,因此我们规定这种补码代表-128,因此若是8位的有符号数的范围是-128~+127,共有256中状态,和下面我们说的无符号数能代表的256中状态是一致的。

2.计算机补码的作用

       为了简单起见,我们假设使用的是一个8位整数,计算机寄存器也假设是8位的。我学习了n多年的补码了,为什么要引入补码呢,负数还要转换为补码貌似非常麻烦。下面我将讨论一下引入补码的原因。

为什么叫补码?补的什么码,这个名字就挺令人费解的。单单从求补码的规则上来理解补码是非常费劲的。举个例子,-5的原码是1000|0101,补码是1111|1011,-5的原码和补码好像并不是互补的,其实补码的互补性不是指的原码和补码之间,而是指的补码和补码之间的互补性,一个数的补码和它的相反数的补码是互补的,5的补码是0000|0101,-5的补码是1111|1011,这两个补码相加的话正好是0,也可认为是8位能表示的模256,这样的话求一个负数的补码的话就用模减去对应的正数即可,比如-6的补码256-6=250,用二进制表示是1111|1010,这个和用求补码规则求出的是一样的,-6原码是1000|0110,补码是1111|1010,

        8位寄存器能存储256个状态信息0~255,用二进制表示为0000|0000~1111|1111。如果为无符号整数的话,非常好理解,可以表示的范围就是0~255,共256个数字。无符号数的加法和减法都非常好理解,若溢出就会舍去,若不够减就借位。有符号的加法减法就比较麻烦了,若直接用原码的话,符号位是无法处理的,比如5+(-4),5的符号位是0,-4的符号位是1,若直接相加的话符号位是1,后面的数相加得到的结果也是不对的。。。但是若用补码,则符号位可以当成普通的一位数来进行计算,而且整数加负数可以直接进行补码之间的加法运算,假设a是正数,-b是负数,-b的补码是M-b,a+(-b)=a+M-b=M+(a-b)=M-(b-a),若a>b用第一种理解方式,若b>a,用第二种理解方式,我们可以看到用补码计算后的结果也为补码。

下面举两个例子来说明补码在计算上的作用:4-5=-1,如果使用原码的话结果4的原码是0000|0100,5的原码是0000|0101,在cpu中进行相减操作的话结果为1111|1111,这个并不是-1的原码,可见使用原码进行加减操作的话,不能简单的使用按位加减来进行。-4+(-5)=-9,-4的原码是1000|0100,-5的原码是1000|0101,如果进行加法操作的话,符号位若进行相加的话,将变成9,可见这种情况也不能使用原码。上面两种情况使用补码的话可以解决这些问题,4-5的结果是1111|1111,这个就是-1的补码。-4+(-5)=1111|1100+1111|1011直接按位相加符号位也参与运算,结果是1111|0111,这个是-9的补码。

可见使用补码的作用是能实现简单的按位加减运算,这是使用补码的核心作用。

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值