当前位置:   article > 正文

两数之差的补码等于被减数的补码与减数相反数的补码。_硬件探析之补码

用补码表示-4+-7

9d4393d2454f963a1bfd365521b23bdc.png

一、前言

c06441a802b0f34566ff8b4333a26164.png
图 1

——摘自《FPGA那些事--时序篇》

二、正文

我们先看一下数电课本的一般性介绍:

2e2eb9d307c5c85df9eea200261acc70.png
图 2

以上介绍简单粗暴,对于正数 :原码 = 反码 = 补码 = 该数的二进制表示再加上符号位0

对于负数:原码 = {1, 该数的二进制表示} 这里使用了verilog里面拼接符,就是在最左边添加"1"作为符号位。 反码 = {1, 二进制表示按位取反} 补码 = {1, 二进制表示按位取反+1}

上面的介绍,其实对做题帮助很大,毕竟以前读书就是为了做题,类似:将下列十进制有符号数转换成补码表示,假设计算机字长为8。

下面我们来探讨下补码的其他方面。

  1. 何为代码,编码?

在计算机内部,各种各样的信息,数据、指令和字符等都是用0和1来表示。数值信息用二进制数来表示,其余很多信息,均用二进制数码来表示,这些特定的二进制数码并不代表数量的大小,仅仅用于区别不同的事物而已,特定的二进制数码称为代码

通俗来讲,计算机内部有一些01序列,并不代表数值,可能代表一条指令,一个字符等等。我们在设计有限状态机时,01序列可以代表一些状态。当然你也可以自己做一些规定,用01代表一头猪,11代表一只羊。

以一定的规则吧编制代码,用以表示十进制数的值、字母、符号等信息的过程,称为编码。将代码还原成十进制数的值、字母、符号等信息的过程称为译码

原码,反码,补码其实都是上述的代码,和二进制数有本质的区别,它们仅仅是以不同的形式,表示了二进制数的值。类似的还有BCD码,格雷码等等。

编码,实际上是一种人为规定的映射。

2. 开始编码

740ff192e84f09ecaa66b4a53da293ae.png
图 3

我们先考虑4位二进制数的特点,上面的各个数据,是关于红线 “对称”的,“对称”就是说对称位置是按位取反的,比如第8行取反得到第7行,第0行取反,得到第15行。

下面进行编码,我们强加个人的意志到4位二进制数上,规定他们所代表的数值,如第三列所示。此时,这些二进制数便应该称为代码,即补码。

n位补码转化为十进制数:

正数:

7cbc42177f3cc0429616f31a8322358d.png
图 4

负数:

f84a56a9f151cb28fc78f02664dda641.png
图 5

从上图可知,补码转换成十进制数,和二进制数转换为十进制数很类似。

区别就是符号位所占的“比重”是负的。例如:

1011[补码] = (-1) * 8 + 0 * 4 +1 *2 + 1* 1 = -5

3. 加法和减法运算

下面我们来讨论补码的可加性,在不考虑溢出的情况下,因为4位的补码只能表示 -8 ~ +7。若 A + B = C,那么判断: A的补码 + B的补码 != C的补码 ?

73d19c36c477220c2e8f14e53151a58b.png
图 5

验证三种情况:

2的补码 + 4的补码 = 6的补码 -6的补码 + (-1)补码 = (-7)的补码

4的补码 + (-7)的补码 = (-3)的补码

这时我们可以说 :若 A + B = C,则: A的补码 + B的补码 = C的补码

d9da820f1995f33ac68d2c534941adf2.png
图 6

若我们设计了一个无符号数、4位2进制数的加法器,则可以用两个数的补码作为输入,输出两数和的补码,此时加法器便成为有符号数加法器。

下面我们来考虑减法运算,考虑补码的规律性,有:若一个数的补码为X,~X为X按位取反,则有 X + ~X = -1,即 -X = ~X + 1。如图3,第6行加第9行等于 -1。

若A和B为两个数的补码,则有 A - B = A + ~B + 1 。使用这个公式,我们将:

正数 - 正数 转换为 正数 + 负数

正数 - 负数 转换为 正数 + 正数

负数 - 负数 转换为 负数 + 正数

3351413d40c454fec2568d9f80a4b943.png
图 7

因此我们可以设计补码减法器如图,A,B,C分别代表被减数,减数和差的补码表示。

对于乘法运算,依然可以使用补码作为输入输出。则输入输出的符号位满足:

9479a1443df15dd6d5d9e093362252c9.png
图 7

我们可以发现被乘数,乘数和积的符号,满足“异或”的关系。我们可以把所有的正数和负数等乘法,全部转换为正数的乘法,积的符号由上表的异或关系确定。伪代码如下:

45dead8969b18f96755b052716eea68f.png
图 7

26bf754070a632b6c093d14a7f021f2f.png
图 8

这样我们就将无符号数的乘法器转换为有符号数的乘法器。

三、结束语

在数字系统设计中,使用补码来代表有符号数,可以简化硬件,因而广泛使用。

参考资料:
《FPGA那些事时序篇》作者 akuei2
《Computer Organization and Design_ The Hardware Software Interface
[RISC-V Edition]》
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/453948
推荐阅读
相关标签
  

闽ICP备14008679号