大学的时候计算机组成原理曾经说过原码,反码,补码这三种整数的表示类型。那个时候2B一样,只知道通过这些可以把正数,负数,0的算术运算统一掉,具体怎么统一那个时候一直很疑惑。知道几个星期前我上网查了才明白。
首先CPU中的运算器只能执行加法运算,不能执行减法运算,但是减法运算可以转化成加上一个负数的加法运算。
第二个条件是计算机是有字长的,也就是说会有溢出的产生。(溢出是什么,你们自己百度吧,大概意思就是数据太大寄存器无法表示,就丢弃了一些数据)
补码的诞生主要是为了解决将减法转化成加法的问题。
考虑时钟上时间的计算,假设现在时针指向数字3,若问“6小时前时针指向的数字是几”,则可以:
- 将时针逆时针拨动6格。
- 将时针顺时针拨动12 - 6 = 6格。
这两种方式的结果是一样的。这里称12是“模。
故有 3时 - 6个小时 = 3时 + (12 - 6个小时),这里可以看到将减法转换成加法的过程,即“加上模减去绝对值的差”。
而我们知道,计算机是有字长的,通过这个思想我们就可以把计算机中的减法转化成加上一个“正整数”的方式来做了。
计算机中算术运算的模就是2的计算机字长次方。也就是最小能产生溢出的正整数。
所以x的补码的计算 x的补码 = 2^n - x(n是计算机的字长)
同时x + !x + 1 = 2^n(!x表示对x进行取反操作)
所以x = !x + 1(这就是这个计算公式的由来)
参考网址:http://www.douban.com/note/223507364/ (大神真是活跃于各个社区)