在本科微机原理中就早早地接触过补码这个概念,但是对其的理解仅仅停留在原码取反加一的程度,至于为什么提出这个,这个有什么用,怎样得到取反加一这条法则等问题,当时我是稀里糊涂的。现在再回过头来看,要更精确地理解其内涵。
首先我们要明确的一点事这些码都是编码,编码就是用二进制数来表示特定的数字和符号,比如asc码就是用八位二进制数来表示英文字母和各种符号,同理我们也可以用二进制数表示数字大小。
这里我们先对编码的形式进行统一的假设:编码一共w位,[xw-1,xw-2,...,x0],其中每一位不是0就是1.
接下来我们先看无符号数的表示。无符号数的理解起来很简单直观,用一个公式进行总结就很直观,后面的补码也用公式总结才足够方便理解。
这样的翻译编码的方式只能用来表示无符号数。对于很多应用我们还希望表示负数值,所以不能采用上面的翻译编码的方式。
因此我们采用下面的公式进行编码翻译:
这就称为二进制补码。从公式中可以看出,最高位如果是1的话,一来就从-2w开始往上加正数,但是正数的绝对值是小于2w的所以怎么加都不可能使最终值为正;如果第一位为0的话,第一项就不存在,也就是直接加正数。综上我们可以看出第一位决定正负。补码还存在一些不太自然的特性,不对称,也就是说最大的复数取相反数得到的正数是用这个编码表示不了的,但与此同时他带来了一个很自然的特性,就是0的编码只有一种,这一点与什么反码和符号数的古怪属性:0有两种不同的编码完全不同。
最重要的一点就是几乎所有的的现代机器都是用二进制补码!!!