C 语言知识总结
3.3.3 补码(了解)
1 补码的时钟原理
在进行数据运算的时候,尤其是 2 进制的运算时,经常遇到补码的表示形式,我们都知道,负
数的的补码是其绝对值取反,然后在末位加上 1。但是这样做的道理何在呢?为了弄清原因,可以
引用时钟的原理来加以说明。
举个简单例子,有一只需要调整的钟表(假定以 12 小时计时),假如钟表上显示的时间是 5
点整,而现在标准时间是 2 点整,那么要把时针从 5 点调整到 2 点,可以通过两种途径:一种是沿
逆时针方向把时针退回(5-2)=3 格;另一种就是沿顺时针方向让时针前进{12-(5-2)}={12-3}=9
格。
第一种方式是我们常用的方式,因为时钟快了 3 个小时,那就让它退回来 3 小时就好了,这是
减法,但是在计算机的运算中,减法运算相比加法要更加复杂,所以为了简化运算,计算机通常会
采用加法算法,也就是第二种方式。现在解释一下第二种方式,5 点加上 9 个小时是多少?是 14。
但是在这个钟表盘上没有 14,因为数字一到 12 就进位归零了,所以这里的 14 其实就是 14-
12=2,如此可见,顺时针拨动时针 9 格,也可以调整到 2 点这个时间。
根据上面的事例,我们可以将退回 3 格量化得出负数-3,这个负数可以使得 5 点调整为 2 点,
现在我们想用加法来实现这一目的,这就需要求得-3 的补码,这个补码是一个正数,它就是 12+
(-3)=12-3=9。那么,假定在一个 n 进制范围内,有一个负数 x,x 的补码应该是多少呢?结论是,
[x]补=n+x=n-[x]绝对值。
2 原码、反码和补码的计算公式
[x]补 = [x]绝对值按位取反 + 1
[x]原 = [x]补按位取反 + 1
根据补码的时钟原理,就很好理解补码的计算公式了。
这里暂且以 2 进制形式来表示数据,不论这个负数有多少位,在他的取值范围内,最大的数只
能是所有位上都是 1 的非负数(不包括符号位),假定这个数为 y,但是 y 并不是我们上面所说到
的那个进制范围数 n,因为 n=y+1,所以[x]补=y+1+x=y-[x]绝对值+1。而通过计算你会发现,y-[x]
绝对值所得出的数,正好是将 x 除了符号位以外,其他各位取反所得出来的结果,再加上那个 1,
就得出“取反加一”的道理了。
x 为负数时,上面的计算[x]补和[x]原的公式才成立。
对于正整数 x,恒有的 [x]原 = [x]补。
- 7 -