计算机中的补码是怎么来的

在计算机中,如何去表达一个负数?

当然可以增加符号位,通过符号位来区分正数和 负数,为了不影响正数,所以将符号位为0 设为正数,将符号位为1 设为负数。

可是这确实很好得解决了负数的表示问题么?

我们知道,一个正数 加上 它的负数 会等于0。只通过增加符号位并不能做到这一点所以还有其他处理。

在8位二进制
用 8’b0000_0000 ~ 8’b0111_1111 即0~127 来表示正数
用8‘b1000_0000 ~ 8’b1111_1111 即128~255 来表示负数

可是128~255 又应该如何与负数对应才能解决问题呢?

我们知道1个正数加上它的负数会等于0,可是我们的负数已经用正数来表示它了,那么两个正数相加又如何等于0 呢?这时候得联想到进制,在十进制中,如果需要保证两个正数相加个位数为0的话,只要让他们相加等于10的倍数就可以了。

那么对于8位宽数也是一样,即相当于256进制,只要保住这两个数相加等于256即可, 256 = 9‘b1_0000_0000,其中取低八位就为0 了。

所以对于n的负数的对应关系就能用 256 - n 来表示了,即 -1 用 255 表示,-2 用254 表示,-128 用 128 来表示,所以负数能表示的最大范围是 -1 ~ -128。

那么计算机又如何去做这个减法,在8进制中,并不存在 256 这个数字,那么当然 用 255 - n + 1 就能解决。
但是计算机并不擅长用减法,如何使得计算机开销更小呢。

其中 255 - n 能 否用其他方法代替,会发现将 n 取反不就成了255-n 么,那么当然 256 - n 不就成了取反加1。

所以这就是所谓的补码了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值