计算机算法中的数字表示法——原码、反码、补码

目录

  • 1.前言
  • 2.研究数字表示法的意义
  • 3.数字表示法
  • 3.1 无符号整数
  • 3.2 有符号数值
  • 3.3 二进制补码(Two's Complement, 2C)
  • 3.4 二进制反码(也称作 1 的补码, One's Complement, 1C)
  • 3.5 减 1 表示法(Diminished one System, D1)
  • 3.6 原码、反码、补码总结

1.前言

昨天有粉丝让我讲解下定点数和浮点数,本来这部分是打算在FPGA入门系列的最后面来讲的。作者想开的系列真的很多,比如开发FPGA需要学会相关软件Matlab、Vivado、ModelSim等等的使用,每个软件做一个系列;FPGA入门教程做一个系列;基础数字信号处理做一个系列;通信相关的系列;IP核使用详解系列;FPGA数字积木系列(自己设计的一些参数化IP)。但是这些无疑都会花大量的时间去构思和整理资料,会出的比较慢,请读者耐心等待。

这篇文章就先介绍定点数和浮点数的概念,因为要真正讲清楚还得从原码、补码和反码开始讲起。要仔细研究的建议去多看看相关书籍,讲清楚原理之后再讲Matlab里面计算的浮点数怎么转换为定点数到FPGA里面进行使用,以及FPGA里面计算的定点数,怎么在Matlab里面又转换为浮点数。

这里需要重点强调的是,原理虽然很枯燥,但是真的很重要,是绝对不能忽视的,如果原理弄的一知半解,就开始去做处理,后期该踩得坑一个也少不了。

2.研究数字表示法的意义

在计算机算法中,有两个基本设计准则是非常重要的:分别是数字表示法和代数运算的实现。例如:定点数或浮点数就是常用且可行的数字表示法。一些基本的运算,像加法器和乘法器,更为繁琐的运算,诸如求平方根和应用CORDIC算法计算角函数的有效实现,都要以可行的数字表示法为基础实现。
FPGA由于其物理位级编程结构的特点,提供了大量实现数字信号处理算法所需要的计算机算法。这恰好与带有定点多级累加器内核的可编程数字信号处理器(programmable digital signal processors,PDSP)相反。在FPGA设计中仔细地选择位宽就能够从本质上做到节约。

3.数字表示法

在工程的早期阶段,必须仔细考虑,确定是使用定点数还是浮点数更适合于解决问题。一般可以认为:定点数的实现具有更高的速度和更低廉的成本;而浮点数则具有更高的动态范围且不需要换算,这对较为复杂的算法可能更适合。下图给出了传统和非传统定点数和浮点数的数字表示法的一个概观。两套系统都由许多各自的标准所覆盖,当然,如果需要的话也可以以一种专有形式实现。

3.1 无符号整数

X X X 是 一个 N N N 位无符号二进制数, 则其范围是 [ 0 , 2 N − 1 ] \left[0,2^N-1\right] [0,2N1], 表达式如下:
X = ∑ n = 0 N − 1 x n 2 n X=\sum_{n=0}^{N-1} x_n 2^n X=n=0N1xn2n

其中 x n x_n xn X X X 的第 n n n 位二进制数字(也就是 x n ∈ [ 0 , 1 ] x_n \in[0,1] xn[0,1] )。数字 x 0 x_0 x0 称作最低有效位(Least Significant Bit, LSB), 具有相当于个位的权重。数字 x N − 1 x_{N-1} xN1 就是最高有效位(Most Significant Bit, MSB), 具有相当于 2 N − 1 2^{N-1} 2N1 的权重。

3.2 有符号数值

在有符号数字表示法中, 数字和符号是单独表示的。第一位代表符号, 余下的 N − 1 N-1 N1 位代表数字, 表达式如下:
X = { ∑ n = 0 N − 1 x n 2 n X ≥ 0 − ∑ n = 0 N − 1 x n 2 n X < 0 X= \begin{cases}\sum_{n=0}^{N-1} x_n 2^n & X \geq 0 \\ -\sum_{n=0}^{N-1} x_n 2^n & X<0\end{cases} X={n=0N1xn2nn=0N1xn2nX0X<0

表达式的范围是 [ − 2 N − 1 , 2 N − 1 ] \left[-2^{N-1}, 2^{N-1}\right] [2N1,2N1], 有符号数字表示法的优点就是简化了溢出的问题, 但缺点就是加法需要根据哪一个操作数更大来进行区分运算。

3.3 二进制补码(Two’s Complement, 2C)

有符号整数的 N N N 位二进制补码表达式如下:
X = { ∑ ∞ − 0 N − 1 x n 2 n X ≥ 0 2 k − ∑ n = 0 1 − 1 x n 2 n X < 0 X= \begin{cases}\sum_{\infty-0}^{N-1} x_n 2^n & X \geq 0 \\ 2^k-\sum_{n=0}^{1-1} x_n 2^n & X<0\end{cases} X={0N1xn2n2kn=011xn2nX0X<0
其范围是 [ − 2 N − 1 , 2 N − 1 − 1 ] \left[-2^{N-1}, 2^{N-1}-1\right] [2N1,2N11]。目前数字信号处理领域,最常用的就是用二进制补码来表示有符号数。这是由于它可以累加多个有符号数,且最终结果也在N位范围内,即可以忽略一切算术上的溢出。

例如,我们计算两个3位数的差(3-2=?):
3 10 ↔ 01 1 2 C − 2 10 ↔ 11 0 2 C 1 10 ↔ 1.00 1 2 C \begin{array}{rrr} 3_{10} & \leftrightarrow & 011_{2 C} \\ -2_{10} & \leftrightarrow & 110_{2 C} \\ 1_{10} & \leftrightarrow & 1.001_{2 C} \end{array} 3102101100112C1102C1.0012C

溢出可以忽略。所有的计算都是取模 2 N 2^N 2N 。这样就有可能出现不能够正确表示中间值的情形,但只要最终值有效, 结果就是正确的。例如计算 3 位的数字 2 + 2 − 3 2+2-3 2+23, 会得到一个中间值 010 + 010 = 10 0 2 C 010+010=100_{2 C} 010+010=1002C, 也就是 − 4 10 -4_{10} 410, 但是结果 100 − 011 = 100 + 101 = 00 1 2 C 100-011=100+101=001_{2 C} 100011=100+101=0012C, 是正确的。

二进制补码还可以用来实现模 2 N 2^N 2N 的算法, 而且不需要在算法中作任何改动。

3.4 二进制反码(也称作 1 的补码, One’s Complement, 1C)

N N N 位二进制反码数字表示法可以表示的整数范围是 [ − 2 N − 1 − 1 , 2 N − 1 − 1 ] \left[-2^{N-1}-1,2^{N-1}-1\right] [2N11,2N11] 。在二进制反码中,正整数和负整数除了符号位之外具有相同的表示方法。那么“0”就有正的和负的,两个表达式。二进制反码中有符号数的标准表达式如下:
X = { ∑ n = 0 N − 1 x n 2 n X ≥ 0 2 N − 1 − ∑ n = 0 N − 1 x n 2 n X < 0 X= \begin{cases}\sum_{n=0}^{N-1} x_n 2^n & X \geq 0 \\ 2^N-1-\sum_{n=0}^{N-1} x_n 2^n & X<0\end{cases} X={n=0N1xn2n2N1n=0N1xn2nX0X<0

请看下面的简单示例:
3 10 ↔ 0 1 1 1 C − 2 10 ↔ 1 0 1 1 C 1 10 ↔ 1. 0 0 0 1 C 进位 → → → 1 1 C 1 10 ↔ 0 0 1 1 C \begin{array}{rrrrrr} 3_{10} & \leftrightarrow & & 0 & 1 & 1_{1 C} \\ -2_{10} & \leftrightarrow & & 1 & 0 & 1_{1 C} \\ 1_{10} & \leftrightarrow & 1. & 0 & 0 & 0_{1 C} \\ 进位 & & \rightarrow & \rightarrow & \rightarrow & 1_{1 C} \\ 1_{10} & \leftrightarrow & & 0 & 0 & 1_{1 C} \end{array} 310210110进位1101.0100100011C11C01C11C11C
在二进制反码中需要, “进位问绕(carry wrap-around)” 加法。在最高有效位与最低有效位相加得到正确结果时, 就会出现进位。

尽管如此, 这种数字表示法还走能够有效地实现模 2 N − 1 2^N-1 2N1 运算, 而且不需要校正。因此二进制反码在实现特定的 DSP 算法(例如: 整数计算不 2 N − 1 2^N-1 2N1 的 Mersenne 变换)时, 还是有其特殊价值的。

3.5 减 1 表示法(Diminished one System, D1)

减1表示法是一种有偏移的数学表示法。正整数与二.进制补码相比减少了 1。 N N N 位 D1数值范围是 [ − 2 N − 1 , 2 N − 1 ] ( \left[-2^{N-1}, 2^{N-1}\right]( [2N1,2N1]( 不含 0 ) ) ) 。D1 数字表示法的编码规则定义如下:
X = { ∑ n = 0 A − 1 x n 2 n − 1 X ≥ 0 2 N − ∑ n = 0 N − 1 x n 2 n X < 0 2 N X = 0 X= \begin{cases}\sum_{n=0}^{A-1} x_n 2^n-1 & X \geq 0 \\ 2^N-\sum_{n=0}^{N-1} x_n 2^n & X<0 \\ 2^N & X=0\end{cases} X= n=0A1xn2n12Nn=0N1xn2n2NX0X<0X=0

从下面两个 D1 数相加可以看到, 对于 D1 而言还必须计算补码和颠倒进位的加法。
3 10 ↔ 0 1 0 D 1 − 2 10 ↔ 1 1 0 D 1 1 10 ↔ 1. 0 0 0 D 1 进位 → . -1 → 0 D 1 1 10 ↔ 0 0 0 D 1 \begin{array}{rrrrrr} 3_{10} & \leftrightarrow & & 0 & 1 & 0_{D 1} \\ -2_{10} & \leftrightarrow & & 1 & 1 & 0_{D 1} \\ 1_{10} & \leftrightarrow & 1. & 0 & 0 & 0_{D 1} \\ 进位 & & \rightarrow &\fbox{. -1} & \rightarrow & 0_{D 1} \\ 1_{10} & \leftrightarrow & & 0 & 0 & 0_{D 1} \end{array} 310210110进位1101.010. -1011000D10D10D10D10D1
D1 数不需要在算法上作任何改动就能够有效地实现模 2 N + 1 2^N+1 2N+1 运算。比如可以利用这一结论在 2 N + 1 2^N+1 2N+1 计算环中实现费尔出 NTT(Fermat Network Transfer Table, Fermat 网络传输表)。

3.6 原码、反码、补码总结

上面说了这么多,又是公式又是例子的估计很多人都开始晕了,现在直接总结口诀如下:

对于有符号数而言:

1.二进制的最高位是符号位:0表示正数,1表示负数(口诀0——>0,1——>-)。

2.正数的原码、反码、补码都是一样的(三码合一)。

3.负数的反码 = 它的原码符号位不变,其他位取反(0——>1,1——>0)。

4.负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1。

5.0的反码、补码都是0。

6.在计算机运算的时候,都是以补码的方式来运算的。

7.当我们看运算结果的时候,要看它的原码。

原码、反码、补码

关注微信公众号获取更多资讯:​​​​![在这里插入图片描述](https://img-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662526.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java实现异步的4种方式

文章目录 异步1、Future与Callable2. CompletableFuture3. Spring框架的异步支持3.1 启动类开启对Async的支持 EnableAsync3.2 配置自定义线程池3.3 异步业务3.4 调用异步业务方法 4. 使用消息队列4.1 安装RabbitMq4.2 使用4.3 MQ消息丢失以及重复消费问题 5、总结 异步 异步&…

在线思维导图编辑!3个AI思维导图生成软件推荐!

思维导图&#xff0c;一种以创新为驱动的视觉化思考工具&#xff0c;已经渗透到我们日常生活和工作的各个角落。当我们需要整理思绪、规划项目或者梳理信息时&#xff0c;思维导图总能提供极大的帮助。 近些年随着云服务等基础设施的完善&#xff0c;我们可以看到越来越多提供…

Vue3实战笔记(34)—完美的菜单组件封装

文章目录 前言多层菜单封装总结 前言 之前简单的封装了一下菜单组件&#xff0c;数据都是写死的&#xff0c;多层嵌套没有支持&#xff0c;学完了组件传值&#xff0c;计算属性就可以继续完善了。 多层菜单封装 先看下数据结构&#xff1a; {"id":"1",&q…

手推车式电缆故障定位系统

武汉凯迪正大一体化电缆故障高压发生器用于测试各种型号的380V,600V,10kV,35kV,110kV,220kV,380kV电压等级的铜铝芯电力电缆、同轴通信电缆和市话电缆的各类故障&#xff0c;如电缆全长、开路、短路、断线、低阻故障、高阻故障、高阻泄露、高低阻抗接地、接地故障、铠装接地故障…

研发设计管理、研发设计管理系统有哪些

研发设计管理系统种类繁多&#xff0c;每种系统都有其特定的功能和用途。以下是一些常见的研发设计管理系统及其主要功能&#xff1a; PLM&#xff08;产品生命周期管理&#xff09;研发管理系统&#xff1a; 功能&#xff1a;管理产品从概念、设计、开发、制造、销售到维护的…

读《Diffusion Models: A Comprehensive Survey of Methods and Applications》综述

读《Diffusion Models: A Comprehensive Survey of Methods and Applications》综述 关于此文&#xff0c;我的一个见解想法&#xff0c;重点关注他怎么描述 「Diffusion Model」的引用的&#xff0c;以及未来方向就好了。当然从这篇文章可以知道 「Diffusion Model」的一个基石…

芝加哥大学最新研究:GPT-4与财务预测,重塑财务分析的未来

最近&#xff0c;芝加哥大学的研究团队发表了一篇突破性的研究&#xff0c;展示了大型语言模型&#xff08;LLM&#xff09;&#xff0c;特别是 OpenAI 开发的 GPT-4&#xff0c;如何在财务报表分析领域取得了与专业分析师相匹配甚至超越的表现。这项研究不仅凸显了人工智能在高…

Firefox国际版

Firefox国际版官方网址&#xff1a; Download the Firefox Browser in English (US) and more than 90 other languagesEveryone deserves access to the internet — your language should never be a barrier. That’s why — with the help of dedicated volunteers around…

Docker-----emqx部署

emqx通过Docker容器化部署流程 1.创建持久化挂载目录 mkdir -p /home/emqx/etc ------挂载emqx的配置文件目录 mkdir -p /home/emqx/data ------挂载emqx的存储目录 mkdir -p /home/emqx/log ------挂载emqx的日志目录 [root home]# mkdir -p /home/emqx/etc [root home]# mkd…

C++ vector 模拟实现

vector的底层也是一个动态数组&#xff0c;他与 string 的区别就是&#xff0c;string 是专门用来存储字符类数据的&#xff0c;为了兼容C语言&#xff0c;使用C语言的接口&#xff0c;在string的动态数组内都会都开一块空间用来存 \0 &#xff0c;而vector则不会。 首先我们要…

文本生成流程图 泰酷啦 Excalidraw Mermaid Obsidian

前言 介绍一个很酷的工具&#xff0c;Mermaid to Excalidraw 。作用是用代码生成流程图。 Mermaid 是一款强大的、轻量级的文本到图表的转换工具&#xff0c;它允许用户使用简单的Markdown风格的语法编写文本描述&#xff0c;然后通过JavaScript引擎将其转换成美观的图表。Mer…

YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在图像识别中&#xff0c;学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系&#xff0c;但这种形式效率极低。因此&…

在VSCode 中增加文件与文件夹的可辨识度

今天重新打开VSCode&#xff0c;打算新建一个项目做测试&#xff0c;看到VSCode中的文件与文件夹很不容易辨认&#xff0c;有时候容易导致一些误操作&#xff0c;需要做一些配置来改变。 效果图&#xff1a; 只需要做简单的2步就可以了。 1、安装插件 ⑴ 打开VSCode的扩展搜索并…

服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程

服务器的远程桌面无法连接&#xff0c;服务器远程桌面无法连接问题处理教程。 一、问题概述 服务器远程桌面无法连接是日常运维中常见的问题之一。它可能由多种原因造成&#xff0c;如网络问题、服务器配置错误、远程桌面服务未启动等。本教程将指导您逐步排查并解决这些问题。…

yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明&#xff1a;参考官方开源的yolov10代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 yolov8、v9还没玩热乎&#xff0c;这不yolov10又来了&#xff0c;那么…

定点化和模型量化(三)

量化解决的是训练使用的浮点和运行使用的硬件只支持定点的矛盾。这里介绍一些实际量化中使用到的工具。 SNPE简介 The Snapdragon Neural Processing Engine (SNPE)是高通骁龙为了加速网络模型设计的框架。但它不只支持高通&#xff0c;SNPE还支持多种硬件平台&#xff0c;AR…

软件即服务-SaaS

目录 1. SaaS成熟度模型 2. SaaS应用平台 3. SaaS应用实现层次 4. 多租户技术 5. 可配置性 5.1 业务构件 5.2 数据可配置 5.2.1 定制字段 5.2.2 预分配字段 5.2.3 名称值对 5.3 功能可配置 5.3.1 业务构件设计 5.3.2 功能包设计 5.3.3 销售包设计…

Postman快捷功能-批量断言与快速查询替换

大家好&#xff0c;在我们日常的接口测试工作中&#xff0c;经常需要对接口返回的数据进行断言&#xff0c;以确保接口的正确性。当接口数量较多时&#xff0c;逐个编写断言语句会变得非常繁琐。此外&#xff0c;在接口测试过程中&#xff0c;我们还可能需要频繁地查找和替换某…

遇到软件测试职业瓶颈,如何突破

作为职场人&#xff0c;遇到发展瓶颈是在所难免的&#xff0c;无论是晋升受限、技能升级缓慢&#xff0c;还是工作激情的丢失&#xff0c;这些挑战都可能让人感到挫败。但是&#xff0c;积极应对&#xff0c;你就可能找到那扇通向新机遇的窗。 1. 自我评估 识别问题 是缺乏技能…

内存卡频频提示格式化?数据恢复全攻略

内存卡提示需要格式化 在数字时代&#xff0c;内存卡作为我们存储数据的常用设备&#xff0c;广泛应用于手机、相机、无人机等多种设备中。然而&#xff0c;不少用户在使用过程中会突然遭遇一个令人头疼的问题——内存卡提示需要格式化。这一提示往往伴随着数据的丢失风险&…