背景问题:你知道计算机中以什么形式存储整数吗?是符号位加值位吗?值位是按照正常的二进制方式存储的吗?假如用3位二进制进行存储,符号位0正1负,1是存成001,-1是存成101吗?
答:使用补码的方式而不是正常的方式存储,虽然是符号位加值位,但符号位承载的信息和值位的值不是你想象中的方式,比如用3位二进制进行存储,符号位0正1负,1会存成001,-1会存成111
首先来回忆一下刚学计算机时候的教材里是怎么解释补码的:
- 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。
- 机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。
- 机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是它的反码在未位加1而得到的。
- 现代计算机中普遍使用补码表示法,而不是原码。
WTF!WHY?!
OK,下面我们来一一解答
一、计算机为什么使用补码的形式存储整数
出于简化计算机基本电路的考虑,让加减法都只需要用加法电路实现。所以需要把减去一个正数或加上一个负数都用加上一个正数的方式来表示,于是在存储的时候,负数被直接存储成一种可以直接当成正数来相加的形式 (正数不变,所以以后的讨论中有时候略去正数),这种形式就是补码
延伸阅读
学习是年轻人改变自己的最好方式