小熊笔记(C++):补码原理这么巧妙!原码,补码,反码,面码,不对...好像没有面码?!

前言:

计算机的补码其实就是数学上的“同余定理”,但小熊在动物园的时候没能好好学数学QAQ,所以这篇笔记想要用最简单的方法来和各位谈谈什么是补码。

头上长草了,就不怕秃头了

补码的神奇之处:

  • 神奇之处一:解决了+0和-0的问题。
  • 神奇之处二:补码可以让计算机带符号运算,简化运算流程。

正片:

对于第一个“神奇”,在动物园的树懒学习int的时候发现了一个怪事情。那就是int的范围问题。我们都知道一个int是4个字节,一个字节是8位,那么一个int就占32个二进制位,除去第一个符号位置,还剩31个二进制位。那么根据古典概率,一个位置要么是0,要么是1,所以31个二进制位总共能表示231种数字。那么问题来了,如果是正数,那么0…231 -1,这个0,到底算+0,还是计算在-0里面?答案是,如果是0的话,那么就只有+0,不存在-0这种说法,对于-0,实际上是让它多表示一位最小的负数,这就是为什么int的范围表示负数的数值部分会比正数的多出一位来!

看不懂没关系,请往下面看!

那么下面就要说到这样做的好处了,-0是可以直接作为一个int所能表示的最小数值参与运算。

好啦,下面就是第二处神奇的解释了。看完下面的第二处神奇解释,第一处神奇的问题也会迎刃而解。

巧妙的时钟:

我觉得别人的文档可能说的比我好,直接走一波教程链接:
CSDN:关于源码,补码,反码的简单解释

但我还是想补充我的想法。
首先想像一个带符号的4位整形数据类型。那么这个数据类型除去1位符号位那么占了3位真值。它能表示的最大数字是7,由于-0的存在最小的数字是-8。它的模是8。

现在,有0,1,2,3,4,5,6,7这8个数字,有一只青蛙在数字5上面,那么它想跳到数字2,它可以向左边跳跃3个单位,到数字2上面,现在,多啦A梦在数字7上面安装了传送门,当向从7继续往右的时候会重新回到数字1。也就是相当于0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7…无限套娃。现在青蛙又多了一种方式,那就是从5向右跳跃5个单位。

这种引生出来的数学问题就是:5-3=2;5+(5-8)=2
就是这个道理,实际上数学的mod也可以像我这样理解成一个圆环。-8就是这个圆环的一圈,就像赛道一样。无非就是-8绕了多少圈一样。最终结果还是2。

下面用二进制模拟。
4位数据类型,带符号。
5-3=2(十进制)
++++++++++++++++
好的,3+x=8,x是未知数。计算x,那么x=8-3
可是,我们最大只能表示到7(0111),要表示8就要7+1即(0111+0001)
那么8-3就是(0111+0001-0011)
即(0111-0011+0001),这是什么过程?你看到这因该就明白了吧,这不就是源码转反码的过程吗?首先的0111-0011就是反码的过程,然后+0001就是补码的过程。就是这样!!!
但上面过程我写了符号位,其实,在转补码的过程之中不考虑符号位。
最后符号位为1。表示负数
+++++++++++++++++
然后,5+5(为-3的补码)的过程是:
0101(正数,5的补码)+1101(-3的补码)=10010
多出来的一位溢出了,就不放入内存,直接就是0010。
答案吻合。
10010是18
18-8-8=2
-8这个轮回绕了两次。
1101是8+5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值