补码
(1)冯·诺依曼体系
众所周知,冯·诺依曼提出了经典计算机体系结构:1台计算机由硬件系统和软件系统组成。
其中又有,5个部分构成上述所说的硬件系统:运算器,控制器,存储器,输入设备、输出设备。
如图所示,3个部分构成上述所说的运算器:累加器,寄存器,ALU。
人们发现,二进制数的减法运算,可以通过特殊的加法运算实现。因此,现在省去开销大的减法器,只需要开销小的累加器。累加器对2进制数字的补码相加,可以模拟出10进制数字的减法和加法。
因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减。但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单。
计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0
所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了。于是人们开始探索 将符号位参与运算, 并且只保留加法的方法。
(2)原码
通过除二取余法,可以得到2进制数字。
2进制加法没有什么特别的,原码直接相加即可。
2进制减法会消耗过多的硬件资源,因此不值得推荐。
原码:正数和负数都有原码。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放其绝对值的二进制数。
(3)反码
反码:正数和负数都有反码。正数的反码等于原码。负数的反码就是他的原码除符号位外,按位取反。
(4)补码
补码1:正数和负数都有补码。正数的补码等于原码。负数的补码等于反码+1。
补码2:负数的补码还等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。
此时,在补码中也不存在负零了,因为1000表示-8,-8是负数的“起点”。在有符号计算中,补码的表示范围是-8~7。
(5)模
循环计数系统所能表示的数字个数或状态数。
时钟的计量范围是0~11,模 = 12。 32位计算机的计量范围是2^32,模 = 2^32。模”是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数,如12的余数有0,1,2,3,4,5,6,7,8,9,10,11。
(6)补数
钟表从11点拨到8点有两种方法:
<1>一种是倒拨3小时,即:11-3=8
<2>一种是顺拨9小时:11+9=12+8=8
在以模为12的系统中,加9和减3效果是一样的,因此凡是减3运算,都可以用加9来代替。对“模”12而言,9和3互为补数(二者相加等于模)。
补码3:所以我们可以得出一个结论,即在有模的计量系统中,减一个数等于加上它的补数,从而实现将减法运算转化为加法运算的目的。
(7)补码的第4种求法
下面这个例子中,正数是负数的绝对值,如正数7和负数-7,正数6和负数-6等等。并不是任意两个无关数字,因为要通过求和来研究相反数之间的关系。
负数反码 + 正数反码 = 1111
// 1111类似于十进制中的9
(负数反码+1) + 正数反码 = 负数补码 + 正数补码 = 1111 + 1 = 1,0000 = 模
其中:正数反码 = 正数补码 = 正数原码
// 1,0000类似于十进制中的10,注意十进制的模也是10
补码4:1,0000 - 正数补码 = (负数反码+1) = 负数补码
感谢
JavenLaw:https://www.imooc.com/article/16813?block_id=tuijian_wz
华中科技大学:慕课——计算机组成原理