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

news2024/10/6 14:31:07

目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SRE视角下的DevOps构建之道

引言&#xff1a; 随着数字化时代的飞速发展&#xff0c;软件成为了企业竞争力的核心。为了更高效地交付高质量的软件&#xff0c;DevOps&#xff08;Development和Operations的组合&#xff09;作为一种文化、实践和工具集的集合&#xff0c;逐渐成为了行业内的热门话题。然而…

怎样快速查找网页代码中存在的错误?

计算机很机械&#xff0c;代码中存在微小的错误&#xff0c;计算机就得不到正确的运行结果。比如&#xff0c;一个字母的大小写、比如&#xff0c;个别地方丢掉了一个符号、、、如此等等。这就要求程序员和计算机是心灵相通的&#xff0c;不能有任何的“隔阂”。 但是&#xf…

汇智知了堂实力展示:四川农业大学Python爬虫实训圆满结束

近日&#xff0c;汇智知了堂在四川农业大学举办的为期五天的校内综合项目实训活动已圆满结束。本次实训聚焦Python爬虫技术&#xff0c;旨在提升学生的编程能力和数据分析能力&#xff0c;为学生未来的职业发展打下坚实的基础。 作为一家在IT教育行业享有盛誉的机构&#xff…

【ArcGISPro】3.1.5下载和安装教程

下载教程 arcgis下载地址&#xff1a;Трекер (rutracker.net) 点击磁力链下载弹出对应的软件进行下载 ArcGISPro3.1新特性 ArcGIS Pro 3.1是ArcGIS Pro的最新版本&#xff0c;它引入了一些新的特性和功能&#xff0c;以提高用户的工作效率和数据分析能力。以下是ArcGIS…

基于Udp(收发信息使用同一个socket)网络通信编程

想要实现网络通信那么就要有一个客户端一个服务器 客户端发送数据&#xff0c;服务器接收数据并返回数据 网络通信就是进程通信 所以我们用两个程序来分别编写客户端和服务器 服务器 1&#xff0c;设置端口号&#xff0c; 2、ip可以固定位127.0.0.1来用于本地测试&#xff0c…

dbserver 软件 展示 全部模式库

目录 1 问题2 实现 1 问题 dbserver 软件 展示 全部模式库 2 实现 以上就可以了

基于文本来推荐相似酒店

基于文本来推荐相似酒店 查看数据集基本信息 import pandas as pd import numpy as np from nltk.corpus import stopwords from sklearn.metrics.pairwise import linear_kernel from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extrac…

扩散模型--论文分享篇

定义&#xff1a;输入文本与图像&#xff0c;生成对图像的描述。 所采用的方法&#xff1a;对比学习、基于跨注意力机制的多模态融合 基于扩散模型的方法&#xff1a;主要介绍的扩散的原理 图像生成任务介绍 GAN VAE 扩散模型 基于GAN的图像生成&#xff0c;一个生成器与判别…

非量表题如何进行信效度分析

效度是指设计的题确实在测量某个东西&#xff0c;一般问卷中使用到。如果是量表类的数据&#xff0c;其一般是用因子分析这种方法去验证效度水平&#xff0c;其可通过因子分析探究各测量量表的内部结构情况&#xff0c;分析因子分析得到的内部结构与自己预期的内部结构进行对比…

子网划分案例

4.2子网划分 “有类编址”的地址划分过于死板&#xff0c;划分的颗粒度太大&#xff0c;会有大量的主机号不能被充分利用&#xff0c;从而造成了大量的IP地址资源浪费。因此可以利用子网划分来减少地址浪费&#xff0c;即VLSM (Variable Length Subnet Mask)&#xff0c;可变长…

Java实现对象存储的4种方式(本地对象存储、MINIO、阿里云OSS、FastDFS)

文章目录 Java实现对象存储的3中方式1、概述2、本地对象存储2.1 配置本地文件相关信息2.2 通用映射配置 ResourcesConfig2.3 文件上传业务 LocalSysFileServiceImpl2.4 上传接口2.5 演示 3、MINIO3.1 依赖3.2 配置3.3 配置连接信息3.4. MINIO文件上传业务3.5 文件上传下载接口3…

高考前很焦虑?看看罗永浩提的三个建议!罗永浩推荐的随身WiFi居然蕴含这样的商机?2024普通人如何翻身?

你能相信现如今身家过亿的老罗罗永浩高中就辍学了吗&#xff1f;相信很多人都不敢置信吧。罗永浩无论是表现出来的口才、情商还是智商&#xff0c;无论如何都无法让人把他和高中辍学联系起来。 而这一点似乎也是老罗人生中的一个遗憾&#xff0c;于是又在一年高考季的时候&…

【AREngine BUG 解决方法】无法获取有效的相机图像尺寸

近期拿了一台 华为mate20 Pro的手机&#xff0c;在运行AR示例的过程中出现了黑屏。 问题排查 SDK版本&#xff1a;com.huawei.hms:arenginesdk:3.7.0.3 定位 经排查&#xff0c;发现(ARCamera对象的相机内参) getImageDimensions()返回的图像尺寸的width和height都为0。 这…

【AI大模型】如何让大模型变得更聪明?基于时代背景的思考

【AI大模型】如何让大模型变得更聪明 前言 在以前&#xff0c;AI和大模型实际上界限较为清晰。但是随着人工智能技术的不断发展&#xff0c;基于大规模预训练模型的应用在基于AI人工智能的技术支持和帮助上&#xff0c;多个领域展现出了前所未有的能力。无论是自然语言处理、…

Dinky MySQLCDC 整库同步到 Doris

资源&#xff1a;flink 1.17.0、dinky 1.0.2、doris-2.0.1-rc04 问题&#xff1a;Cannot deserialize value of type int from String &#xff0c;detailMessageunknowndatabases &#xff0c;not a valid int value 2024-05-29 16:52:20.136 ERROR org.apache.doris.flink.…

电脑录屏怎么录?7个电脑录屏软件免费版强势来袭,赶快收藏!

电脑录屏怎么录&#xff1f;相信很多小伙伴们都不知道怎么在Windows电脑上录屏吧&#xff1f;在当今社会&#xff0c;随着互联网的快速发展&#xff0c;越来越多的小伙伴们开始通过制作视频内容来分享知识、展示技能或者记录生活。电脑录屏成为了一种简单高效的方式&#xff0c…

C语言-----指针数组 \ 数组指针

一 指针数组 用来存放指针的数组 int arr[10]; //整型数组 char ch[5]; //字符数组 int * arr[6]; //存放整型指针的数组 char * arr[5]; //存放字符指针的数组 // 指针数组的应用 int main() {int arr1[] { 1,2,3,4,5 };int arr2[] { 2,3,4,5,6 };int arr3[] { 3,4,…

LED显示屏模组七大参数

LED模组是LED显示屏的核心组件&#xff0c;它包含LED线路板和外壳&#xff0c;将LED灯珠按照特定规则排列并封装&#xff0c;通常还会进行防水处理。随着LED显示屏行业的发展及其广泛应用&#xff0c;LED模组的功能和作用变得愈加重要。那么&#xff0c;LED模组的七大参数是什么…

光栅幅值细分原理与实现

本文介绍光栅幅值细分原理与实现。 光栅是工业测量领域中常见的传感器&#xff0c;如下图。主要厂家有雷尼绍&#xff0c;海德汉&#xff0c;配套的光栅读数头有模拟信号的&#xff0c;也有直接细分输出数字脉冲的&#xff0c;本文的细分针对模拟信号&#xff0c;即有正弦信号…

苹果iOS18将引入ChatGPT;美国AI禁令再升级;微软首发Phi-3多模态模型 | AI头条

整理 | 王轶群 出品 | AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 一分钟速览新闻点&#xff01; 谷歌努力手动删除搜索中奇怪的人工智能答案 苹果和OpenAI签订协议&#xff0c;将在iOS18引入ChatGPT 微软发布主打视觉能力的 Phi-3-vision 模型 苹果押注…