当前位置: 首页 > news >正文

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

目录

  • 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-

相关文章:

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

目录 1.前言2.研究数字表示法的意义3.数字表示法3.1 无符号整数3.2 有符号数值3.3 二进制补码(Twos Complement, 2C)3.4 二进制反码(也称作 1 的补码, Ones Complement, 1C)3.5 减 1 表示法(Diminished one System, D1)3.6 原码、反码、补码总结 1.前言 昨天有粉丝让我讲解下定…...

BGP策略实验

一、实验要求 二、实验分析 1.先配置IP 2.再配置BGP 3.配置BGP策略 三、实验过程 要求 1. [r4]ip ip-prefix aa permit 192.168.10.0 24 [r4]route-policy aa permit node 10 [r4-route-policy]if-match ip-prefix aa [r4-route-policy]apply preferred-value 100 [r4]rout…...

目标检测 | R-CNN、Fast R-CNN与Faster R-CNN理论讲解

☀️教程&#xff1a;霹雳吧啦Wz ☀️链接&#xff1a;https://www.bilibili.com/video/BV1af4y1m7iL?p1&vd_sourcec7e390079ff3e10b79e23fb333bea49d 一、R-CNN R-CNN&#xff08;Region with CNN feature&#xff09;是由Ross Girshick在2014年提出的&#xff0c;在PAS…...

【busybox记录】【shell指令】mkdir

目录 内容来源&#xff1a; 【GUN】【mkdir】指令介绍 【busybox】【mkdir】指令介绍 【linux】【mkdir】指令介绍 使用示例&#xff1a; 创建文件夹 - 默认 创建文件夹 - 创建的同时指定文件权限 创建文件夹 - 指定多级文件路径&#xff0c;如果路径不存在&#xff0c…...

SQL刷题笔记day6-1

1从不订购的客户 分析&#xff1a;从不订购&#xff0c;就是购买订单没有记录&#xff0c;not in 我的代码&#xff1a; select c.name as Customers from Customers c where c.id not in (select o.customerId from Orders o) 2 部门工资最高的员工 分析&#xff1a;每个部…...

KITTI数据中pose含义

Folder ‘poses’: The folder ‘poses’ contains the ground truth poses (trajectory) for the first 11 sequences. This information can be used for training/tuning your method. Each file xx.txt contains a N x 12 table, where N is the number of frames of this …...

C++模拟实现stack和queue

1 stack 1.1概念 stl栈 1.2栈概念 1.3代码 2 queue 2.1概念 stl队列 2.2队列概念 2.3代码...

awtk踩坑记录一:awtk-web build.py编译过程笔记

工作需求&#xff0c;接触了awtk, 要求把界面部署到web上&#xff0c;期间因为各种编译问题卡的半死&#xff0c;提了不少issue, 经过几天补课&#xff0c;把项目的编译结构给摸了一遍&#xff0c;做个记录&#xff0c;也希望能帮到有同样问题的朋友。 之前python只是略接触过…...

docker容器中解决中文乱码

1. 找到dockerfile文件 2. 编辑Dockerfile 添加 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 3. 生成新的镜像文件 FROM java17_yinpeng:latest MAINTAINER YP <2064676101QQ.COM> ADD jiquan_online_chat.jar jiquan_online_chat #CM…...

Javascript 位运算符(,|,^,<<,>>,>>>)

文章目录 一、什么是位运算&#xff1f;二、如何使用1. 位与&#xff08;AND&#xff09;&#xff1a;&用途&#xff08;1&#xff09;数据清零&#xff08;2&#xff09;判断奇偶 2. 位或&#xff08;OR&#xff09;&#xff1a;|用途&#xff08;1&#xff09;向下取整 3…...

Golang项目代码组织架构实践

Golang在项目结构上没有强制性规范&#xff0c;虽然这给了开发者很大的自由度&#xff0c;但也需要自己沉淀一套可行的架构。本文介绍了一种项目布局&#xff0c;可以以此为参考设计适合自己的 Golang 项目组织模式。原文: Golang Project Layout Go 有很多强制的或是约定俗成的…...

网工内推 | 国企信息安全工程师,CISP认证优先

01 浙江省公众信息产业有限公司 &#x1f537;招聘岗位&#xff1a;安全运营工程师 &#x1f537;职责描述&#xff1a; 1. 负责公司内部安全运营平台及其子系统的安全事件管理、事件发现分析、应急响应和系统维护等&#xff1b; 2. 负责风险和漏洞管理&#xff0c;包括漏洞预…...

RAG 高级应用:基于 Nougat、HTML 转换与 GPT-4o 解析复杂 PDF 内嵌表格

一、前言 RAG&#xff08;检索增强生成&#xff09;应用最具挑战性的方面之一是如何处理复杂文档的内容&#xff0c;例如 PDF 文档中的图像和表格&#xff0c;因为这些内容不像传统文本那样容易解析和检索。前面我们有介绍过如何使用 LlamaIndex 提供的 LlamaParse 技术解析复…...

《TCP/IP网络编程》(第十二章)I/O复用(2)

下面是基于I/O复用的回声服务器端和客户端代码 1.Linux系统 服务器端代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // POSIX标准定义的通用函数&#xff0c;如close() #include <arpa/inet.h> //…...

AI企业需要“联盟营销”?一文带你探索AI企业营销新玩法!

为什么联盟营销对AI业务有较大优势 联盟营销在电商领域、saas领域与其他产品领域同样有效。在AI业务中&#xff0c;它有效的原因与其他领域大不相同。 高好奇心和试用率 AI领域是创新的热点。它吸引了一群渴望探索和尝试每一项新技术的人群。这种蓬勃的好奇心为聪明的AI企业提…...

你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

目录 一、onMounted的前世今生 1.1、onMounted是什么 1.2、onMounted在vue2中的前身 1.2.1、vue2中的onMounted 1.2.2、Vue2与Vue3的onMounted对比 1.3、vue3中onMounted的用法 1.3.1、基础用法 1.3.2、顺序执行异步操作 1.3.3、并行执行多个异步操作 1.3.4、执行一次…...

JavaWeb基础(一)-IO操作

Java I/O工作机制&#xff1a; 注&#xff1a;简要笔记&#xff0c;示例代码可能较少&#xff0c;甚至没有。 1、Java 的 I/O 类库的基本架构。 ​ Java 的 I/O 操作类在包 java.io 下&#xff0c;大概有将近80个类&#xff0c;这些类大概可以分为如下四组。 基于字节操作的…...

拼多多(PDD)社招一面原题

未成年游戏退费 5 月 28 日&#xff0c;中国互联网协会发布《未成年人网络游戏服务消费管理要求&#xff08;征求意见稿&#xff09;》团体标准。 该标准是游戏行业首个完整的消费管理规范&#xff0c;可用于未成年人游戏消费退费纠纷解决&#xff0c;也可为相关行政部门、司法…...

类中使用QtConcurrent::run

在QtConcurrent::run中调用类的成员函数时&#xff0c;你需要注意几个关键点&#xff1a; 对象生命周期&#xff1a;你需要确保在QtConcurrent::run调用的整个期间&#xff0c;类对象都是有效的。如果对象在成员函数执行期间被销毁&#xff0c;将会导致未定义行为。成员函数访…...

基于深度学习的中文情感分析系统python flask

基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看&#xff0c;下载下来&#xff0c;简单部署&#xff0c;就可以使用。 包含&#xff1a;项目源码、数据库脚本、软件工具等&#xff0c;该项目…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...