为什么计算机要使用补码

首先,考虑进制问题,更高的进制有更多的电位,采用二进制问题最少。

其次,必须有符号位,在日常中,符号位通常是第一位,不妨将其放在最高位,例如以下 4bit 的计算机中:

如果用 1xxx 表示正数,0xxx表示负数,显而易见,0会出现两次,即10000000 ,这里浪费了一个数字。

不妨设 0xxxxxx在十进制表示下为 t ,将 0xxx 视为 t-1 ,例如0000=-1

这里已经初步解决问题了,然而计算机不能较好解决减法,通常的做法是把他加到溢出,例如最大为 15 ,要想计算 8-2 就得计算 (8+(16-2)) MOD 16 = 6,这里 16-2 其实是取反操作。(其实这里是5bit)

到这一步,理论上来说已经解决了问题了,可为什么计算机用的是补码而不是这样的编码方式呢?

首先,负数的处理及其麻烦,考虑 a+b ,如果a 是负数的话,先要把a转化成正数,然后再取反(符号位不取反),例如 -2+5=0001+1101=0110+1101=(符号位)+1011(->011),还需要通过比较大小确定符号位。

考虑到刚刚利用到的那一个进位,这里用 INT_MAX 表示最大数字,那么很显然最小数字就是-INT_MAX-1,刚才的操作就是相当于b+(INT_MAX-|a|) ,如果最后是正数就说明 b>|a| 换句话说,数字位最大一位发生了进位。

此时就好操作了,交换符号位,正数用0xxx表示,负数用1xxx表示。

回顾刚才的加法操作,如还有一个取反的步骤,多次相加必然耗费更多时间,不如一开始就给负数取反。

于是,你就得到了补码。

(这是我yy的一种成因,实际的原理可能不一样,不过这也是符合逻辑)