什么是补码,补码的由来是什么?为什么要用补码,这个问题困扰了我很久。现在我来一一解答下面的问题 如果你只是想不求甚解的了解,那么你可以忽略这个blog
本blog的目的是:
了解补码的由来证明这些条件他是对的
什么是补码
什么是补码,它仅仅是一个数据的编码格式,用来方便计算机进行减法运算的。
谁发明了补码这个已经很难确定了,但莱布尼茨发明了二进制,是谁把补码引入到二进制,然后得出完美的计算机呢?这个我不甚了解。
计算机只有累加器,他怎么做减法?没有这个功能,那么有没有一种可能,他能用加法来代替减法进行计算。
补码原理由来
这就需要我们用到时钟了 我在时钟3点的时候选择去遗忘你,如今已经4点了,我还是想回到3点之前,可时间不能停留 哎!我有一计,你再等11个小时,那不就3点了嘛,我真是一个小机灵鬼! 没错补码就是这么来的! 4-1 = 4 + 11 = 3 !? 这这是为什么?因为时钟不能表示比12大的数字了
在用十进制来谈
先谈正数
我们这里来举一个简单的例子,比如说一台机器只能识别0-9 之间的10进位制数。如果是12,那么他只能识别到2 那么有 5 - 3 = 5 + 7 = 2 那么我们就可以说在十进位制中 -3的补码是7
我们可以发现, 7+3 = 10啊,就是最大识别位数(9)+1啊 公理1 : 如果一个机器能识别 n位数, 那么对于任意一个负数x的补码为
∣
x
∣
+
补数
=
10...0
(
n
个零)
|x| + 补数 = 10...0(n个零)
∣x∣+补数=10...0(n个零) 这里的初始值是指,如果在十进制中, 4位数的初始值就是 1000
再谈负数
如果, 是 1 - 3= 根据 -3 的补码是7 可以得出, 1+7 = 8! 1-3怎么可能等于8呢,这怎么可能科学呢!计算机学它不存在了!它为什么就支持正数呢!
修复理论
这里我们修复一下我们的理论,我们不是来取余数(如果谁在给你说取余数,直接反驳他,小逼崽子有没有深入思考),而是!做减法! 5+7 -10 = 2 1+7 - 10 = -2 (结果要做减法!但是由于正数已经溢出了,就不用做减法,可是负数没有溢出,有多) 定理2:有多少个负数参与加法,就要进行多少次减法 这样理论就完全修复了。
理论拓展
那如果机器是能识别0-99呢,155只能识别到55
22 - 12 -12的补码是谁呢?
x + 12 = 100 x = 88 22+ 88 = 10(这里应该是110,但是机器识别不到)
如何在十进位制中寻找补码
我们这里设为x 那如果这个机器能识别0 - 9…9(n个9) 你是不是就可以类推,56 的补码是谁了 没错就是 补码 = 10…0(n个0) - 56
引用在2进制中
如果放在2进制呢? 一个机器可以表示 -1…1(n个1) ~ +1…1(n个1)之间呢
这里为了形象,这里的n=7 111 1111 - 101 1111 101 11111 + 补码 = 1 000 0000(公理1)
补码 = 1 000 0000 - 101 1111
如果动一下脑子就是 111 1111 +1 - 101 1111 也就是 111 1111 - 101 1111 + 1
欸,这此你就知道位数要各个位置取反,末尾+1了吧! 然后我们验证一下 111 1111 + 010 0001 = 1 010 0000 其中第1位置的1超越了机器能表示的范围
但是,机器嘛,机器嘛,分不清整数和负数啊,于是我们引入了源码第一位1 表示负数, 0 表示正数(为什么1表示负数呢?这里必须这样规定,你会发现天才的想法!)
加上这个标记,还能进行相加减嘛? 这是的题目就成了
0 111 1111 + 1 101 1111
0 111 1111 + 1 010 0001 = 1 0 010 0000
八嘎亚路,不要小瞧天才和计算机之间的羁绊啊!!!
完美的一个进位把负数给消除了!第一个1又超过了他的表示范围!科学家想到这个是巧合嘛?!!我简直不敢相信
结果是整数的我们看过了,如果结果是负数呢? 我们再来验证
0 101 1111 - 0 111 1111
= 0 101 1111 + 1 111 1111
= 0 101 1111 + 1 000 0001
= 1 110 0000(补码)
这里解释一下为什么这里得出的结果是补码,其实啊,是这个
欸欸欸,等一下,记得我们的公理2嘛?做减法
1 000 0000 - 110 0000(这里是纯数值相减,不是原码)
= 111 1111 - 110 0000 +1
= 各位取反,末尾+1
他是一个补码兄弟们! 又是巧合!
这真是巧合嘛?这真是人能想出来的嘛?!
这里 补码的原理就这样了,大家拜拜