原码、补码、反码

首先,计算机中只有加法器,没有减法器,所有的减去某个数,都是通过加上某个特定的数来实现的。
具体的实现原理可以从日常生活中窥知:向左转90度与向右转270度是相同的。这是因为,这两个数存在下面的关系:90+270 = 360。即二者的和刚好是360的整数倍。在这里,如果把270定义为原数,90定义为补数,那么360就是它们的模。如果我们把向左转定义为“正”,向右转定义为“负”,那么我们可以通过加法(+270)来实现减法(-90)了。
在计算机中,补码的定义也是为了方便运算:

当一个数为正数时,它的补码就是它本身;而当为负数时,它的补码(8位)为2^8减去它的绝对值。这样的话,不论是加法还是减法运算,都是把它们的补码相加即可。举2个例子.:

15+7 = 22:
00001111
00000111
00010110
15-7 = 8:
00001111
11111001
00001000

注意,-7的补码为:
100000000
-00000111
 11111001
但是,别忘了计算机是不能计算减法的,有没有别的办法求出补码呢?
我们可以先观察一下数字的2进制的表达式的规律:

十进制 绝对值的二进制 补码             
+127 0111 1111 0111 1111
+126 0111 1110 0111 1110
…… …… ……
+   2 0000 0010 0000 0010
+  1 0000 0001 0000 0001
    0 0000 0000 0000 0000
-1 0000 0001 1111 1111
-2 0000 0010 1111 1110
……    
-127 0111 1111 1000 0001
-128 1000 0000 1000 0000
我们看到以下事实:(注意,这些只是事实,不是编译器或者CPU规定的!)
1.正数的最高位为0,负数的最高位为1。
2.整数的补码就是它本身;负数的补码和绝对这之间存在着这么一个事实:对绝对值取反,然后加1,就会得到补码。所以我们又规定了反码:
正数的反码是这个数本身;负数的反码是这个数的除了符号位每一位都取反操作。到这里,我们才明白了为什么是“除了符号位”——因为反码是用来计算补码呢,而计算补码使用的是绝对值。

整理一下思路,是先有原码,为了计算减法,而有了补码,为了计算补码,而有定义了反码。

我突然想到了冈萨雷斯的《数字图像处理》(第三版),它在每一章的扉页上,都有一条名人名言。其中在第二章上面写的是:
“要想成功,就必须弄清楚基础问题”——亚里士多德


你可能感兴趣的:(原码、补码、反码)