1,熟悉几个概念:原码、反码、补码
原码:
最高位表示符号位,其它表示具体数值,原码示例如下:
[+2]10 = [0000 0010]原
[- 1]10 = [1000 0011]原
反码:
正数的反码是其本身,负数的反码符号位不变,其余按位取反:
[+2]10 = [0000 0010]原 = [0000 0010]反
[- 3]10 = [1000 0011]原 = [1111 1100]反
补码:
正数的补码是其本身,负数的补码是在反码的基础上加1:
[+2]10 = [0000 0010]原 = [0000 0010]反 = [0000 0010]补
[- 3]10 = [1000 0010]原 = [1111 1100]反 = [1111 1101]补
小结:正数的补码是其本身,负数的补码是反码加1.
2,相关数学原理
- [A]原 = [[[A]补]补]原
- [Z]补 = [X+Y]补 = [X]补 + [Y]补
3,推导演算
以2-3为例:
[2-3]原 = [[[2+(-3)]补]补]原
= [[[2]补+[-3]补]补]原
= [[[0000 0010]+ [1111 1101]]补]原
=[[1111 1111]补]原
=[1000 0001]原
4,扩展理解
补码的符号既然参与运算,机器字长为8的符号位表示数值是27=128。
我们就用10进制来增强理解,假设符号位表示100,有效操作数取值区间[-100,100)
计算:89 - 72
模拟补码运算:89 - (100 -28)= 89+28-100 =17 +100 -100
89+28溢出产生一个符号位和真值17,两个符号位抵消
计算结果为17,符号位是0,真值也是17
计算:72 - 89
模拟补码运算:72 - (100 - 11)=72 + 11 - 100 = 83 - 100
72+11没有溢出没有产生符号位,真值为83
计算结果为83,符号位是1,真值便是83-100 = -17
二进制进行补码运算也是一样的原理
计算:2-3 = [0000 0010]-[0000 0011]
补码运算:
=[0000 0010]-([1000 0000]-([1000 0000]-[0000 0011]))
=[0000 0010]-([1000 0000]-[0111 1101])
=[0000 0010]+[0111 1101]-[1000 0000]
=[0111 1111]-[1000 0000]
=值+符号位
=[1111 1111]
这样真值便是:[0111 1111]-[1000 0000] = 127-128=-1
[1000 0000]-[0000 0011]:这个操作等价于取真值部分的“补码”,这个要仔细体会下
5,总结
1,计算机采用补码运算让计算电路简单高效,只处理加法操作,而不用理会减法
2,以补码的方式存储在计算机中,可以直接读取进行加法操作,补码可以区分原码不能区分的0和-0。补码的-0代表的是-128
第一次写文章,欢迎大家指点,拍砖。