计算机中所有的数字都是以补码的形式表示!!!(原码和反码都只是理论概念)
记住这句话对于理解 原码 反码 补码 有着巨大作用。
基础理论1:计算机表示有符号数的规则
每个字节的最高位(最左边一位)表示正负:0表示正数,1表示负数。
引出问题1:负数该如何被正确地表示
由于计算机只有累加寄存器,所以只有加法运行规则。
按照基础理论1:一个字节的
+1 应该用 0000 0001表示
-1 应该用 1000 0001表示
两者相加得:1000 0010 机器读作:-2。显然不对。所以负数的表示方法是不是有问题,该如何正确表达负数?
解决方法1:补码
首先不要去关注补码是什么,我们先来推演一下如何获得补码的规则:
按照基础理论1:
0 应该用0000 0000 来表示。
+1 比0大1 所以用 0000 0001来表示。
-1 比0小1 但是八位数都是0 所以从最高位(最左边)的左边借一位数将 0000 0000 看作 1 0000 0000 减去1 得到:1111 1111。
同理 -2 用 1111 1110表示。
此时 +1 加上 -2 的结果为:1111 1111 机器读作:-1。由此问题1 得到解决。我们把这种解决方法称作补码。
补码就此诞生:
正数表示规则符合我们对于数的大小基本认识,所以规定正数的补码就是其本身。
负数的表示规则比较反常,我们把得到负数表示规则的过程叫做求补过程。
引出问题2:求补过程该如何计算
既然找到了负数的正确表示方法,那同符号相减如何变换成相加?
解决办法2:求补运算
经过各种将 正数转化为其相反数 的运算尝试,科学家发现了机器求得正数相反数最快的方法:取反 + 加一。只需两个步骤即可求得一个数的相反数 即 求补。
例子:
+3 表示为:0000 0011.
取反:1111 1100
加一:1111 1101 。此时机器读作:-3。结果无误。
但是大家会问:取反能理解,为什么要加一。
加一的原因:
因为0 占了正数一个位置:一个字节八位:共表示256个数字,0既不是正数也不是负数,但是按照 基础理论1的规则 却占据了正数一个位置,所以负数比正数多了一位。
重新梳理思路
看到这里,我们就明白了 补码的来龙去脉,所以我们重新梳理一下逻辑:
按照 计算机表示正负数的规则 表示有符号数的方式 叫做 原码。
由于计算机只有累加运算器,所以只能做加法,引出了两个问题:
- 如何进行异符号数 相加? 针对该问题提出补码的解决方案。
- 同符号数如何相减? 针对该问题提出 求补运算方法。在求补运算中取反后的表示方法叫做反码。
总结规则
- 由于求补运算极快,所以计算机中所有数字都是以补码的形式存在。
- 正数表示符合常识,所以正数的反码和补码都和原码 一样。
无符号数表示规则:
最高位不再表示正负,正常计算即可。