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

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

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

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


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

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

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

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


N为二进制数能表示的无符号整数范围是 ,所能表示的有符号整数范围是.

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

表示无符号数时,最大数,

表示有符号数时,由于我们采用的是补码的形式,所以,

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

我们列一个表格,来看看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补码表示的最小位宽,直接给出公式:

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

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

  1. 2.2.2 定点数的运算(移位、原码和补码的加减乘除、溢出概念和判别方法)

    文章目录: 1.定点数移位运算 (1)算术移位 (2)逻辑移位 (3)* 循环移位 2.定点数加减法运算 (1)原码加减 (2)补码加减 为什么机器中使用补码运算呢? 3.符号扩展 (1)正数符号扩展 ...

  2. 二进制数的原码反码补码转换

    #include <iostream> #include <math.h> #include <string.h> using namespace std; voi ...

  3. 数制和码制(数制的转换的方法,BCD码<8421,2421,5421,余三码>,格雷码,原码,反码,补码,定点数和浮点数)

    目录 1.数制的转换 1)二,八,十六进制进制转十进制 加权系数求和法 2)十进制转二,八,十六进制 除基取余法(短除法) 减权定位法 3)二,八,十六进制的相互转换 2.BCD码 3.格雷码 4.原 ...

  4. 原码、补码以及定点数运算

    1 进制相互转换 1.1 十进制转换二进制 十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并. 1.1.1 整数部分          ...

  5. 8位二进制数的原码、反码、补码以及它能表示的范围

    ===================================================================================== 1.正数的反码和补码都与原码 ...

  6. 数字的原码,补码,反码,~和‘-’的区别。取反与负号的区别。

    一.原码,反码,补码的基础概念和计算方法. 原码,反码,补码只是计算机存储数字的一种方式. 1,原码 原码就是用第一位表示符号位,其余位表示值,比如8位的二进制数 [+1]原 = 0000 0001 ...

  7. 2.2.1 定点数的表示 原码 反码 补码 移码

    没有未来的未来不是我想要的未来 o(╥﹏╥)o (つД`)(ノへ ̄.)哭了 学习的是定点数的表示,那我们首先来认识一下什么叫定点数与定点数相对应的另一个概念叫做浮点数所谓定点数就是指小数点的位置固定不 ...

  8. 【王道计组笔记】定点数编码方式(原码,补码,反码)

    无符号数:整个机器字长全部二进制位均为数值位,没有符号位,相当于数的绝对值 表示范围:n位二进制数0~2^n-1 有符号数:用一位二进制数表示正负(0正1负) 小数点的表示问题:约定小数点的位置来实现 ...

  9. 二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储

    1. Java中数字默认是十进制,二进制.八进制以及十六进制的表示如下 2. 二进制.八进制.十六进制和十进制的相互转换 2.1 为了不累赘描述,本文以百度的二进制小数转换为十进制小数为例,如下图 2 ...

最新文章

  1. Chrome 打印PDF技巧
  2. P2502 [HAOI2006]旅行
  3. 学习笔记57_WCF基础
  4. MySQL下使用Inplace和Online方式创建索引的教程
  5. 京东上市了,员工有多少股票? .
  6. lgg6 android 9,LG G6的18:9屏幕用起来到底是什么样
  7. 真狠!10000mAh超大电池手机发布,真的神机...
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的体育竞赛比赛赛事管理系统
  9. 切单个图标为背景透明的方法
  10. 截取年月日在hana中怎么写_2020高会评审进行中 工作业绩怎么写才能在评审时脱颖而出呢?...
  11. Python入门--方法重写
  12. Oracle 12C -- 不同容器之间切换
  13. 如何利用linux分析转录组数据库,对转录组测序数据进行分析以及注释
  14. ireport 实现动态合并单元格
  15. [油猴脚本] 知乎免广告
  16. 2023-2028年中国压铸机行业发展前景与投资趋势分析报告
  17. 3D打印切片软件Cura及CuraEngine原理分析
  18. Java计算一个数的平方根(即:根号)
  19. Hadoop垃圾回收站与YARN日志聚合
  20. 20172319 《程序设计与数据结构》第11周学习总结

热门文章

  1. 现实给了梦想多少时间
  2. windows下硬盘安装mint10
  3. Linux系统开机过程详细分析
  4. linux mate桌面主题下载_MATE-Desktop 1.11 发布下载,Linux 桌面
  5. html div比例,我的前端组件 ---- 16:9固定宽高比例的div
  6. python把nan值去掉_python – Keras Neural Nets,如何删除输出中的NaN值?
  7. gis快速接地开关_一种基于扫描电镜和能谱仪的GIS放电异物来源分析方法
  8. 一个中等规模的七段数码数据库以及利用它训练的识别网络
  9. 中文TTS文字转语音合成模块合成成品带喇叭 替代SYN6288和XFS5152
  10. 2021春季学期-创新设计与实践-Lesson4