前言:
计算机的补码其实就是数学上的“同余定理”,但小熊在动物园的时候没能好好学数学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