补码到底是个什么东西 什么是补码

什么是补码(补码到底是个什么东西)
概述
先引入一个前提 , 在计算机中数字是以二进制进行存储的 , 也就是我们看到的2 , 在计算机中存储的是10 。我们进行的加法运算 2+1=3 在计算机中是这样的(这里先假设计算机存储的是4位二进制数字) 网0010+0001=0011
很容以看的出来 , 4为二进制数能表示的最大数字是1111 , 就像两位十进制数表示的最大数字是99一样 。那如果在进行加法运算时 , 结果超出存储的容量怎么办?比如:9+9=18 二进制表示为:1001+1001=10010 , 但是 , 因为只能存储4位数的原因 , 最高位丢了 , 结果变成了 0010 , 也就是2 , 这时是发生了溢出的 。在做运算时要避免数值发生溢出(当然 , 现在计算机存储的数字为64位 , 日常使用完全不用担心)
运算不光有加法 , 还有减乘除 。乘法就是多次加法 , 除法就是多次减法 。那么减法如何实现呢?在刚开始的时候 , 计算机只能进行加法运算 , 这时一部分人想办法让其能够直接进行减法计算 , 而另一部分人想通过加法来实现减法 , 最终后者先给出了解决方案 。(只是我臆网想的情景)
通过加法来实现减法
还记得上面提到的 , 四位二进制数表示的最大数字为15 , 当发生溢出时:
16=>二进制:10000 => 0
17=>二进制:10001 => 1
显然 , 去掉最高位等于减去16
那么能不能利用加法溢出来实现减法呢?下面简单推倒一下:
9-2=7 若要实现 9+x=7 那么利用溢出的原理 , 就要实现 9+x=7+16=23 简单的解一下方程 x=23-9=14  ,  很好 , 来验证一下:
9+14 的二进制表示为:1001+1110=10111 最高位溢出 , 结果为:0111 也就是7 , 完美 。
下面问题来了:如何将上边的2转成14呢?也就是讲二进制的0010转成1110 。他们有什么关系呢?
伟大的数学科学家前辈们总结出了规律 。并发明了反码和补码的概念 。补码就是上面转换后的14 。
原码=>按位取反=>反码
反码=>加1=>补码
虽然不知道这个规律是如何找出来的 , 但经过无数次验证 , 确实是这样 。
引入负数
当引入了负数的概念时 , 为了表示正负 , 规定第一位为符号位(0为正 , 1为负) , 因为引入符号位 , 原来的4位数 , 能表示的最大值也变成了0111 。
因为负数的引入 , 现在所有的减法都可以当做加法来实现了 , 9-2=9+(-2) , 或者说9+(-2)=9-2 。计算仍然是通过补码来实现 。
负数的补码为:符号位不变按位取反 , 再加1
正数的补码为:它本身
负数的补码很好理解 , 就是上面总结的规律 , 利用加法来实现减法 。正数的补码为啥是它本身呢?你看刚才分析的减法 , 只有被减数进行了转换 , 减数没变吧 。很好理解 。其实也是为了可以统一进行处理 , 引入补码后 , 正负数可以使用一套加减法规则进行计算 。
简单实验一下:
2+(-4)=-2
-4 => 二进制表示:1100 => 补码:1100
2 => 二进制表示:0010 => 补码:0010
1100+0010=1110(补码)
将计算结果再转成原码 1010 , -2没毛病
然后 , 有一个尴尬的问题 , 正数的0为: 0000 , 负数的0为:1000 , 同一个数字 , 但是换成补码后 , 你会发现是同一个数字: 0000 。

推荐阅读