首先需要明确,计算机中数字都是以二进制进行运算。
如何计算
原码就是原来的表示方式;
反码就是将数字按位取反;
补码就是取反加一。
那么究竟为什么这么算?为什么需要补码?
模的概念
模在这里表示计量范围,比如一个10进制二位数的模是100,能表示0~99,一个8位二进制数实际能表示的范围是1 0000 0000b个数字,从0~1111 1111。这些能表示的数字其实都是模的余数,因为不可能大于等于模。
补数
补数就是模减去当前数字。比如在十进制中,二位十进制数88的补数就是100-88=12。二进制中,一个四位数1001的补数就是10000-0001=1111。
那么补数的存在有什么意义呢?
可以使减法变成加法。
从模的概念可以看出,一个数字表示方法的模为m的话,那么用该方法表示的a和b相减就可以表示为
a-b=a+(m-b)(mod m)=a+(m-b)
m-b就是b的补数。可以理解为 减一个数=加这个数的补数,就比如将时钟从6点向前拨4个点到2点和从6点往后拨8个点到2点效果是一样的。因为进位被忽略了(超出了表示范围)。
实质上计算机的四则运算都是运用了加法,包括乘除也是依此为基础,这样非常利于计算机运算。
反码和补码
反码的英文是one’s complement
也就是1的补数,1的补数就是0,那么0的补数就是1,在二进制中表现为取反,这就是反码。
补码的英文是two’s complement
也就是2的补数,它和二进制更加对应,一个有限位数的二进制数的模就是是100…00(0的个数和位数相同),比如四位数的模就是10000,那么一个四位数x的补数就是
10000-x=1111-x+1
1111-x实际上就是取反,所以补码就等于一个数取反+1。