计算机补码计算的理解

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

第一次写文章,欢迎大家指点,拍砖。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。