最近这段时间总有小伙伴问小编什么是补码(补码到底是个什么东西) 是什么,小编为此在网上搜寻了一些有关于什么是补码(补码到底是个什么东西) 的知识送给大家,希望能解答各位小伙伴的疑惑。
什么是补码(补码到底是什么)
摘要
(相关资料图)
首先引入一个前提。在计算机中,数字是以二进制存储的,也就是我们看到的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
7 = >二进制: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变成1优优资源网4?也就是说,二进制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
100+0010 = 1110(补码)
把计算结果转换成原代码1010,-2就可以了。
然后,有一个尴尬的问题。正数0是:0000,负数0是:1000。是同一个数,但是用补码代替后你会发现还是同一个数:0000。
总结一下:用补码计算就是用加法实现减法,利用计算机存储的位数有限的特点,超过溢出,丢失更高位。
不知道哪位大科学家发明了补码,前人栽树后人乘凉,顶礼膜拜。