对于原码 反码和补码的概念。见下面链接,讲的不错:
http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
这里只讲下自己对反码的理解。大家都知道使用反码表示负数有两个优点,
1. 可以使得减法可以和加法一样。
2. 符号位也参与了运算。
那这是为什么呢?下面可以进行一些简单的数学推导:
根据反码定义,对于负数,反码是除符号为以外取反+1。
例如,-4 变换步骤如下。
A: +4 = 0 000 0100
B: 取反 = 0 111 1011
C: +1 = 1 111 1100 (并设符号为1,表示负数)
其中,在忽略符号位的情况下:
A 到 B 的取反可以发现实际是,
B = 127 - A
所以,C = 127 - A + 1 = 128 - A
所以当一个计算X - Y的时候,按照反码规则,
我们计算的二进制(忽略符号位)。实际是:V = X + ( 128 - Y )
这里可以看到反码的作用,的确是通过反码的编码将减法变成了加法。
然后考虑到符号位,
(1)例E2,假设X - Y >= 0,那么V >= 128。二进制表示的话就会产生向最高位进位(导致最高位-即符号位+1)。
由于存在负数(最高位为1),所以变为0.(同时进位被舍弃 即 例E2中括号中的1丢弃)
实际效果是V - 128 ,即X - Y.
(2) 见例E1,假设X - Y < 0,那么不会有进位,所以最高为为1,表示负数。记住对于X取反+1,实际是进行了128 - X的操作。
所以 128 - V(即二进制的取反+1)的 -( x - y), 由于知道是负数,加个负号就是x - y了。
例子E1:
3 - 4 = -1.
+3: 0 000 0011
-4: 1 111 1100
-----------------------
1 111 1111
最高位为1,所以为负数。取反+1得值为000 0001,所以是-1.
================ 例子分割=======================
例子E2:
4 - 3 = 1
+4: 0 000 0100
-3: 1 111 1101
---------------------
(1)0 000 0001
特别的对于y= 128 - x ( 0 <= x <= 127 )
对于-128( 1 000 0000 )的值对应的是正数的0(0 000 0000 ) 来映射的。
对于,为什么可以表示[-128,-1]这个我还没大弄明白。不过肯定和取反之后的+1 有关系。
x + (128 - y) = 0有关。
-------------------------
附上讲解才除法的
http://memorymyann.iteye.com/blog/354889