补码

#补码

约定

1、下文中的二进制前导0只写了几个意思一下。
2、限于作者水平,文中肯定存在不妥或错误之处,还望指出。

3+5=8,这是个小学生都会的题,如果我们要研究计算机是如何实现这个加法的,那么答案是现将这两个数转换成二进制,即 0000 0011+ 0000 0101=0000 1000,在计算机中,加法器是被设定好的,但是好像没有减法器这一说,所以我们要计算8-5=3怎么办呢?我们可以改写成8+(-5)=3,那么我们就要获得8和-5的二进制,8的二进制显然是0000 1000,那么-5的二进制是多少呢?这时候我们就要用到补码了。

前置知识
在C/C++中,int 类型的数据的表示范围是-2^ 31~2^31-1,即我们用31个位表示这个二进制的每一位,再用一个最高位表示正负,而unsigned int 把表示最高位的这个位用来存数值而不是正负,所以unsigned int 表示的范围没有负,但是正数的范围要比int 大一倍。

举个栗子
假定在你面前有一个时钟表盘,它的时针指在12的位置,我们要把它拨到指向3,那么我们要把它顺时针拨3下或者逆时针拨9下,我们把顺时针看成正,那么就是+3和-9,对于这两次操作,我们会得到同样的结果,所以我们可以把这两次操作看做等效的。

补码
对于一个负数,我们先不看负号,把这个数的绝对值的二进制表示出来,然后再每一位进行取反操作,(1改0,0改1),再加1,就得到了这个负数的二进制。(注意:表示符号的最高位也从原来的0变成了1,即正到负)。这个过程和上面的钟表异曲同工。你品,细细的品!

正确性判断
我们用上面这个栗子来看,8-5=3。
8的二进制 0000 1000
-5的二进制11111 1011(第一个1表示的是负)
相加得到结果100000 0011
最后结果我们取得0000 0011(溢出部分舍去),即3。

在int里,-2^31表示形式为10000…0000(31个0),想想为什么是这样?
这个数值是等于2^31的,然而int的正向最大范围是2 ^31-1,刚好超过了溢出范围,然后从下限开始,也就是-2 ^ 31。对于补码也同理,用最高位去把它溢出,再从下限开始,这样就能得到负值的二进制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值