杂项(其一)
为什么计算机要使用补码
首先,考虑进制问题,更高的进制有更多的电位,采用二进制问题最少。
其次,必须有符号位,在日常中,符号位通常是第一位,不妨将其放在最高位,例如以下 4bit 的计算机中:
如果用 1xxx
表示正数,0xxx
表示负数,显而易见,0
会出现两次,即1000
与 0000
,这里浪费了一个数字。
不妨设 0xxx
的xxx
在十进制表示下为 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的一种成因,实际的原理可能不一样,不过这也是符合逻辑)
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.