赞
踩
——摘自《FPGA那些事--时序篇》
我们先看一下数电课本的一般性介绍:
以上介绍简单粗暴,对于正数 :原码 = 反码 = 补码 = 该数的二进制表示再加上符号位0
对于负数:原码 = {1, 该数的二进制表示} 这里使用了verilog里面拼接符,就是在最左边添加"1"作为符号位。 反码 = {1, 二进制表示按位取反} 补码 = {1, 二进制表示按位取反+1}
上面的介绍,其实对做题帮助很大,毕竟以前读书就是为了做题,类似:将下列十进制有符号数转换成补码表示,假设计算机字长为8。
下面我们来探讨下补码的其他方面。
在计算机内部,各种各样的信息,数据、指令和字符等都是用0和1来表示。数值信息用二进制数来表示,其余很多信息,均用二进制数码来表示,这些特定的二进制数码并不代表数量的大小,仅仅用于区别不同的事物而已,特定的二进制数码称为代码。
通俗来讲,计算机内部有一些01序列,并不代表数值,可能代表一条指令,一个字符等等。我们在设计有限状态机时,01序列可以代表一些状态。当然你也可以自己做一些规定,用01代表一头猪,11代表一只羊。
以一定的规则吧编制代码,用以表示十进制数的值、字母、符号等信息的过程,称为编码。将代码还原成十进制数的值、字母、符号等信息的过程称为译码。
原码,反码,补码其实都是上述的代码,和二进制数有本质的区别,它们仅仅是以不同的形式,表示了二进制数的值。类似的还有BCD码,格雷码等等。
编码,实际上是一种人为规定的映射。
2. 开始编码
我们先考虑4位二进制数的特点,上面的各个数据,是关于红线 “对称”的,“对称”就是说对称位置是按位取反的,比如第8行取反得到第7行,第0行取反,得到第15行。
下面进行编码,我们强加个人的意志到4位二进制数上,规定他们所代表的数值,如第三列所示。此时,这些二进制数便应该称为代码,即补码。
n位补码转化为十进制数:
正数:
负数:
从上图可知,补码转换成十进制数,和二进制数转换为十进制数很类似。
区别就是符号位所占的“比重”是负的。例如:
1011[补码] = (-1) * 8 + 0 * 4 +1 *2 + 1* 1 = -5
3. 加法和减法运算
下面我们来讨论补码的可加性,在不考虑溢出的情况下,因为4位的补码只能表示 -8 ~ +7。若 A + B = C,那么判断: A的补码 + B的补码 != C的补码 ?
验证三种情况:
2的补码 + 4的补码 = 6的补码 -6的补码 + (-1)补码 = (-7)的补码
4的补码 + (-7)的补码 = (-3)的补码
这时我们可以说 :若 A + B = C,则: A的补码 + B的补码 = C的补码
若我们设计了一个无符号数、4位2进制数的加法器,则可以用两个数的补码作为输入,输出两数和的补码,此时加法器便成为有符号数加法器。
下面我们来考虑减法运算,考虑补码的规律性,有:若一个数的补码为X,~X为X按位取反,则有 X + ~X = -1,即 -X = ~X + 1。如图3,第6行加第9行等于 -1。
若A和B为两个数的补码,则有 A - B = A + ~B + 1 。使用这个公式,我们将:
正数 - 正数 转换为 正数 + 负数
正数 - 负数 转换为 正数 + 正数
负数 - 负数 转换为 负数 + 正数
因此我们可以设计补码减法器如图,A,B,C分别代表被减数,减数和差的补码表示。
对于乘法运算,依然可以使用补码作为输入输出。则输入输出的符号位满足:
我们可以发现被乘数,乘数和积的符号,满足“异或”的关系。我们可以把所有的正数和负数等乘法,全部转换为正数的乘法,积的符号由上表的异或关系确定。伪代码如下:
这样我们就将无符号数的乘法器转换为有符号数的乘法器。
在数字系统设计中,使用补码来代表有符号数,可以简化硬件,因而广泛使用。
参考资料:
《FPGA那些事时序篇》作者 akuei2
《Computer Organization and Design_ The Hardware Software Interface
[RISC-V Edition]》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。