困难的事情不是我们如何理解机器,而是机器如何理解我们
计算机依赖二进制进行运算,而为了配合二进制计算设计硬件电路,人们提出了原码、反码以及补码的概念。本文将针对这些概念及相互之间的转换进行总结。
原、反、补码的概念
原码
原码由两部分组成
- 符号位
- 真值的绝对值
原码的第一位为符号位,其余位为值位,例如:
其中符号位0为正,1为负。原码的表示范围为:[1111 1111, 0111 1111]
,即-127到127。从形式上看,原码符合人类对于数字的认知,所以是人比较能理解的计数方式。
反码
反码的表示方法为:
- 正数即本身
- 负数符号不变、其余取反
一会儿再讨论为什么要这样设计,先记住其定义。
补码
补码的表示方法为:
- 正数即本身
- 负数在反码基础上+1
为何使用原码、反码与补码
根本原因是为了简化电路设计,我们知道加法是很简单的,但是如果要在计算机中引入减法,就会导致电路设计的复杂,所以有没有一种方案能够将减法转换为加法呢?简单来说,减法可以表示为一个数加上另一个数的负数,而通过引入反码与补码的方式,我们可以让符号位也参与到运算中,从而只需要加法即可。我们以1-1=0为例,探讨反码与补码的运算过程。
如果我们使用原码计算1-1即1+(-1),那么得到的结果是:
显然结果不正确。如果我们使用反码计算,那么结果为:
我们发现结果的值部分虽然是正确的,但是问题就处在0上,0带符号是没有任何意义的,如果用反码,会出现两个0,即+0和-0,这显然不是我们想要的结果。于是人们提出了补码,解决了0的问题:
修复之后,0有了唯一的表示,同时,多出来的1000,0000还可以用来表示-128,但是由于实际上的-0表示了-128,所以-128并没有对应的原码和反码表示。
总之一句话:反码和补码是出于对计算机电路简化设计而引申出的定义。