【 数字信号处理 】定点数的表示之二进制数的原码与补码

举报
李锐博恩 发表于 2021/07/15 06:29:23 2021/07/15
【摘要】 为什么要讲这个简单的问题,就是因为看到了一些比较玄乎的表达方式,归根到底也能得到二进制的原码和补码表示,但就是看着难受,为此,为了让自己不被同化,记录下最简单的求二进制原码和补码的方式。 数字信号处理涉及大量的数学运算,既然是数学运算,就涉及一个根本的问题,数字的表示方法。 数字的表示方法分为定点数的表示和浮点数的表示。就FPGA而言,其胜任定点运算的能力更为显著。 定...

为什么要讲这个简单的问题,就是因为看到了一些比较玄乎的表达方式,归根到底也能得到二进制的原码和补码表示,但就是看着难受,为此,为了让自己不被同化,记录下最简单的求二进制原码和补码的方式。

数字信号处理涉及大量的数学运算,既然是数学运算,就涉及一个根本的问题,数字的表示方法。

数字的表示方法分为定点数的表示和浮点数的表示。就FPGA而言,其胜任定点运算的能力更为显著。

定点数所涉及的内容之一,就是二进制数的表示,因为计算机都是以二进制数表示数字,所以对这方面深入理解还是很有必要的。


对于无符号数而言,使用二进制数的原码来表示;

对于有符号数而言,则使用二进制数的补码来表示。

如何求解有符号数的补码呢?

规则是,正数的原码和补码一致,负数的补码是原码的符号位不变,其他位取反加1(或直接取绝对值,之后求反加1).


N为二进制数能表示的无符号整数范围是 \left [ 0,2^{N}-1 \right ],所能表示的有符号整数范围是[-2^{N-1},2^{N-1}-1].

我们不妨试一下,以4位二进制数为例:

表示无符号数时,最大数max=(1111)_{2}=(2^4-1)_{10}=15,min=(0000)_{2}=0

表示有符号数时,由于我们采用的是补码的形式,所以max=(0111)_{2}=2^{4-1}-1=7,

min=(1000)_{2}=-8

这个最小值,我需要提出来讲,因为它比较难以理解。

我们列一个表格,来看看4位二进制有符号整数的补码和原码表示:

十进制数 补码 原码
-8 1000
-7 1001 1111
-6 1010 1110
-5 1011 1101
-4 1100 1100
-3 1101 1011
-2 1110 1010
-1 1111 1001
0 0000 0000
1 0001 0001
2 0010 0010
3 0011 0011
4 0100 0100
5 0101 0101
6 0110 0110
7 0111 0111

从这张表中可以看出,-8不存在原码,那-8的补码是怎么求的呢?或者-8的补码有什么来历?

根据前面的规则:

对于无符号数而言,使用二进制数的原码来表示;

对于有符号数而言,则使用二进制数的补码来表示。

如何求解有符号数的补码呢?

规则是,正数的原码和补码一致,负数的补码是原码的符号位不变,其他位取反加1.

求解负数的补码,一般而言,我们需要得到该数的原码,然后根据规则来求补码,可是我们看到,-8根本就不存在原码,如何有补码呢?

这里是一个规定,规定-8的补码是1000。

别急,我们这里说说来历:

先说说原码的缺陷,为什么有符号数不用原码来表示呢?非要搞出一个补码来?

对于有符号数而言,0的表示有两种:+0和-0,二者是相等的,都是0,如果用原码来表示0,如何表示呢?(以4位2进制数为例)

+0 => 0000

-0  => 1000

这就麻烦了,0有两种表示方法,所以呢?这就是原码表示有符号数的缺陷,我们取0的原码表示为0000,剩下一个1000没用到,后面有用。

既然原码有缺陷,我们设计了补码的表示方法,并设计了求补码的规则,上面已经说了好几遍了。

从-1到-7都可以用这个规则来求解补码,就是-8由于没有原码,无法使用规则求解,这里就将-0的原码1000作为-8的补码表示。

这样,从-1到-8都有相应的二进制码表示了,岂不快哉!


下面的一个话题是符号位扩展:

我们都知道-4的补码表示是1100,这是用4为二进制数表示的,如果我要求用5位二进制数表示,我们同样使用规则来求:

-4的原码是10100,之后符号位不变,其他位取反加1,得到11100.

可见,11100是将1100的符号位扩展1位得到的。

所谓的符号位扩展,是指将符号位向高位复制。这说明符号位扩展是不改变数值大小的。


最后一个话题:

有符号数X补码表示的最小位宽,直接给出公式:

w_{s}=ceil[log_{2}( \left | X \right | + 1 )]+1

对于无符号整数,因为不需要符号位,所以二进制原码表示时的最小位宽为:

w_{s}=ceil[log_{2}(X + 1 )]

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/83188296

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。