数据的表示和运算

目录

一.各进制间的相互转换

1.各进制转化为10进制

2.二进制和八进制,十六进制之间地相互转化

3.十进制转换为其他进制

二.BCD码(Binary-Coded Decimal,用二进制编码的十进制)

1.8421码

2.余3码

3.2421码

三.无符号整数

1.无符号整数在计算机内部的表示

2.无符号整数的加法/减法运算

四.带符号整数

1.带符号整数在计算机内部的表示

•原码

•反码

•补码

补码的加法运算:

补码的减法运算:

•原码,反码和补码的特性对比

•移码

五.定点小数

1.定点小数的原码表示

2.定点小数的反码/补码表示

3.定点小数的加/减运算

4.定点小数中的原码,反码和补码

5.定点小数的位置扩展


首先需要知道以下几个概念:

位权:每一位所占权重。例如下图,K0的权重是10^0

基数:每个数码位所用到的不同符号的个数,r进制的基数为r。例如10进制数的基数就是10(十进制使用的符号为0~9),二进制数的基数就是2(0~1)

计算机中能够处理的数是二进制数,原因如下:

① 只需要使用有两个稳定状态的物理器件就可以表示二进制0或1。

② 0,1刚好对应对应逻辑值假,真。方便实现逻辑运算。

③ 可很方便地使用逻辑门电路实现算术运算。

一.各进制间的相互转换

1.各进制转化为10进制

转换规则如下:

例如:

下面表格建议多熟悉熟悉,看到2^n就需要知道是多少

2.二进制和八进制,十六进制之间地相互转化

① 二进制转换为八进制:每3位为一组,每组转换为对应的八进制符号

:从小数点开始,从前往后/从后往前每3位划分,如果不满三位就补0:

② 二进制转换为十六进制:每4位为一组,每组转换为对应的十六进制符号

③ 八进制转换为二进制:每位八进制对应3位二进制

④ 十六进制转换为二进制:每位十六进制对应4位二进制

(1100 0011)_{2}表示2进制数,1100 0011B也表示2进制数。

其余进制也有其他表示方法:

3.十进制转换为其他进制

① 十进制转换为二进制

对于整数部分,将十进制数,不断除以基数r,直到商为0为止。

对于小数部分,运算规则如下:小数部分*基数r得到的乘积结果的整数部分,对应K_{-1}的值,将剩余的小数部分继续乘基数,得到K_{-2}的值,依次类推:

具体以0.3为例,可以看到10进制表示的0.3没办法用2进制数精确的表示:

补充:可以使用更加快捷的方法---拼凑法

例如,对于十进制数260.75:

整数部分:260=256+4=2^8+2^2

小数部分:0.75=0.25+0.5=2^-2+2^-1

总结

① 整数部分要用除基取余法,小数部分要用乘积取整法。

② 任何二进制小数都能用十进制表示。

十进制的小数不一定能通过二进制精确表示。

② 十进制转换为八进制/十六进制

当我们熟悉了上面快捷的方法,完全可以先将十进制转化为二进制,再将二进制转换为十六进制,例如下图:260.75转换为二进制为100000100.11

将他转换为8进制:

将他转换为16进制:

二.BCD码(Binary-Coded Decimal,用二进制编码的十进制)

我们可以用4bit的信息,表示1个十进制位,因为4个2进制位可以表示2^4=16种状态,而这16种状态就足够表示10进制中的0~9(10种状态)了。其余的6种状态是冗余的。

1.8421码

如下图所示,4种状态分别表示10进制的8,4,2,1。

如果表示5:4+1=5,所以8421码为0101。

依次类推,就可以得到0~9与8421码的映射关系:

十进制转换为8421码:

手算方法:先用十进制得到结果,再将结果转换为对应的8421码。

计算机中使用的方法:

① 计算机会把加数和被加数1000,0101送到算术逻辑单元(ALU),算术逻辑单元进行加法运算后,得到结果:1101,将二进制转化为10进制,得13。

可以观察到,8421码中合法的编码区间为0000~1001,1010~1111没有定义,1100已经超出合法范围,为了使运算结果满足8421码的定义:

当运算得到的结果落在了10~18:9+9(1010~10010),也就是不合法的范围,可以在运算结果的基础上+6,使得结果向高位进一,如下图所示,高4位表示1,低4位表示3(0011),就可以表示十进制数13。

同理,9(1001)+9(1001)=18(10010),超出了8421码能够表示的范围,+6修正:

得到:1   1000,1对应的8421码为1,1000对应的8421码为8,合起来结果也为18。

2.余3码

4个二进制数对应16种状态,将16种状态的其中10种分别映射到0~9这几个数字。像8421码,就是将10种状态映射到0000~1001:

如果换一种映射方式,肯定会得到不一样的结果,例如余3码的映射规则就是:8421码的基础上加3:8321码+0011B

在8421码中,每个二进制位都有固定的权值(8,4,2,1),但在余3码中,每个二进制位并没有固定的权值,所以8421码被称为有权码,而余3码被称为无权码。

3.2421码

2421码也是一种有权码,从高到低,每一位对应的权值为2,4,2,1。

2421码对应的映射关系如下:

注意:

2421码中0~4对应编码的第1位都是0,而5~9对应编码的第1位都是1。这是为了统一2421码的编码策略。例如,5可以表示为0101,1011,为了避免歧义的发生,2421码规定5~9首位必须为1。

三.无符号整数

无符号整数,即“自然数”,0,1,2,3.....,在C语言中,只要用“unsigned”就可以定义无符号整数:

1.无符号整数在计算机内部的表示

计算机内的机器字长限制了每次可以进行运算的bit位,也限制了通用寄存器的长度。例如,某计算机机器字长为8位,那么他最多能同时进行8位运算(现在个人计算机的机器字长通常是64位或32位):

通用寄存器只能存8位2进制数:

对于无符号整数0,存入到寄存器需要扩充为8位:

依次类推,无符号整数256用2进制表示为1 0000 0000 ,超出了寄存器能存储的二进制数的长度,所以寄存器只能保存低8位。

总结:

① 全部二进制位都是数值位,没有符号位,第 i 位的位权是2^{i-1}

② n bit 无符号整数表示范围 0~2^{n}-1,超出则溢出,意味着该计算机无法一次处理这么多③ 可以表示的最小的数 全0,可以表示的最大的数 全1。

2.无符号整数的加法/减法运算

无符号整数的加法:从最低位开始,按位相加,并往更高位进位。

无符号整数的减法:

① “被减数”不变,“减数”全部位 按位取反、末位+1减法变加法
② 从最低位开始,按位相加,并往更高位进位

也就是要把减法操作化作等价的加法操作,原因在于,加法电路造价便宜,减法电路造价昂贵。

例如,对于99-9:

计算机内部进行的操作如下:

“减数”全部位 按位取反,末位+1。

将“A”与“变形得来的B”进行加法操作。

只保留低8位,但是不影响计算结果,0101 1010转化为10进制数为90

四.带符号整数

数学中的带符号整数,就是“整数”,-2,-1,0,1,2,3,4,在C语言中表示为:

以机器字长8bit为例:

1.带符号整数在计算机内部的表示
•原码

8位2进制数,将第1位作为符号位,将剩余位作为数值位,用于表示真值的绝对值。符号位为0,则为正数,符号位为1,则为负数。

① 若机器字长为n+1位,带符号整数的原码表示范围:

-(2^n-1)\leq x\leq 2^n-1

② 原码的真值0有两种形式:+0和-0:[+0]原=0,0000000        [-0]原=1,0000000

原码的缺点:

如下图所示,如果想实现+19+(-19),将两者的原码直接相加,得到的结果是错误的,正确的结果应该是19-19=0才对。

这是因为符号位参与了运算,对于原码的加减,符号位是不能参与运算的,需要设计更复杂的硬件电路才能处理。

怎么才能解决这个问题呢----补码表示法,如果用补码表示各个参与运算的数,符号位就能参与运算,并且得出正确的结果。

所以,计算机内部,所有带符号整数的加/减法都要先转换为补码。

•反码

反码是专门用于原码到补码的转换的:

若原码是一个正数

原码,反码,补码的表示都是一样的,保持不变即可。

若原码是一个负数

① 转换为反码:符号位不变,数值位取反

② 在得到的数末尾+1

-100同理:

注意:

① 原码,反码,补码的最高位都反映了符号。

原码转换为反码,反码转换为原码的操作都是相同的,即符号位保持不变,数值位按位取反。

③ 如果考试的时候,需要将补码转化为反码,不建议直接(补码-1),可以先将补码转换为原码,再将原码转换为反码。

④ 原码与补码之间快速转换的方法:

如果原码是正数:原码和补码相同。

如果原码是负数:原码转换为补码和补码转换为原码的方法相同,即:

从右往左找到第一个1,这个1左边的所有“数值位”按位取反。

例如,原码为1,1100100

从右往左第一个1:1,1100100,“1”左边的所有"数值位"全部按位取反:1,0011100,即得到补码。

补码转原码也是同样的操作,自己可以试试。

•补码
补码的加法运算:

从最低位开始,按位相加(符号位参与运算)并往更高位进位。

注:补码的数值位不能解读为“位权”。如下图所示,正数的补码可以解释为“位权”,但是"负数"则不行。

对于两个负数相加,用补码运算也能得到得到正确结果:

补码的减法运算:

由于减法电路制造成本较昂贵,所以可以用等价的加法电路替代减法电路,思路如下:

A-B=A+(-B)

[A]补-[B]补=[A]补+[-B]补

类比无符号整数的"减法"操作:

① "被减数"不变,"减数"全部位按位取反,末位+1,减法变加法。

② 从最低位开始,按位相加,并往更高位进位。

这里的"减数"对应的就是补码减法中的[B]补,两者的操作是一摸一样的。也就是说,无论是实现无符号整数的减法,还是有符号整数的补码减法,在计算机看来都是一样的,我们可以使用同一套电路就能实现这两种操作。

怎么实现[B]补和[-B]补的相互转换:将全部位按位取反,再在末位+1。

例如下图:

补充:更快的手算方法

与补码,原码之间的相互转换类似:从右往左找到第1个"1",以这个"1"为界,将其左边部分(包括符号位)全部取反,右边部分保持不变。(:原码与补码之间的相互转换是"1"的左边的全部"数值位"按位取反)

知道了[B]补--->[-B]补,那么就可以将补码减法转化为等价的加法操作了,举个例子:

原码,反码和补码的特性对比

1.原码

合法表示范围:

若用n+1bit表示原码,原码的数值位由n个bit表示,那么n个比特能够表示的数值范围是0~2^n-1,再加上1个bit的符号位,所以原码的表示范围

-(2^n-1)\leq x\leq 2^n-1

最大的数:

0,111....111=2^n-1

最小的数:

1,111....111=-(2^n-1)

真值0的表示方式:

[+0]原=0,000....000        [-0]原=1,000....000

2.反码

合法表示范围:

-(2^n-1)\leq x\leq 2^n-1

最大的数:

0,111....111 = 2^n-1

最小的数:

1,000....000 = -(2^n-1)

真值0的表示方式:

[+0]反=0,000....000        [-0]反=1,111....111

3.补码

合法表示范围:

补码的合法表示范围要比原码多一个负数,也就是说,如果使用8bit表示原,反,补码的话,原码的合法表示范围是-127~127,补码的合法表示范围是-128~127。

重要-2^n\leq x\leq 2^{n}-1

最大的数:

0,111...111= 2^n-1

最小的数:

重要:1,000....000=-2^n

这里是定义的,只需要记住这一特殊存在即可。用8bit表示补码,最小的数是-128;用8bit表示原码,最小的数是-127,也就是说-128没有与之对应的原码,原码没有办法表示这一特殊的值。

真值0的表示方式:

重要真值0只有唯一的补码:[0]补=0,000...000

可以这样理解,另一个数1,000....000,被用作表示-2^n了,即被用作表示最小值了。

4.无符号整数

合法表示范围:

0\leq x\leq 2^{n+1}-1

最大的数:

1111...111=2^{n+1}-1

最小的数:

0000...000=0

真值0的表示:

0000...000

总结:

•移码

补码的基础上将符号位取反。

:移码只能用于表示整数,而原码,反码,补码可以用于表示小数。

① 移码和补码相同,只有1种真值0的表示方式,以8bit为例:[0]移=1,0000000

② 移码的合法表示范围也和补码相同,比原码多一位负数:

-2^n\leq x\leq 2^{n}-1

观察一下移码从-128到127的二进制表示,刚好是无符号整数0~255。利用这个特点,移码表示的整数可以很方便地用硬件电路对比大小。移码通常用于表示浮点数的阶码。

用几种码表示的机器数:


五.定点小数

定点数分为定点整数和定点小数,定点整数就是带符号整数。之前在学习定点整数时,我们默认了一点,就是小数点固定在最后一位。小数点前面一位是2^0,再往前为2^1,依次类推,所以“位权”是根据这一位与小数的相对位置决定的。

定点整数可以用原码,反码,补码,移码表示,而定点小数只能用原码,反码,补码表示:

定点小数中,小数点的位置隐含在符号位之后,同理,每一位数的“位权”也是根据这个数与小数点的相对位置决定的,例如小数点后第一位为2^-1,小数点后第二位为2^-2,依次类推:

1.定点小数的原码表示

:定点整数的符号位后面通常由","隔开,而定点小数的符号位后面通常由“.”隔开。

2.定点小数的反码/补码表示

怎么用定点小数的原码得到定点小数的反码和补码呢,其实操作和定点整数一模一样。

3.定点小数的加/减运算

定点小数的加/减法运算也和定点整数的操作一模一样:

定点小数补码的加法:

从最低位开始,按位相加(符号位参与运算),并往更高位进位。

定点小数补码的减法:

① “被减数”不变,“减数”全部位按位取反、末位+1,减法变加法

② 从最低位开始,按位相加,并往更高位进位

举个例子:

和定点整数的处理逻辑是一样的

对比整数补码的加法操作和小数补码的加法操作。下面的例子中,寄存器里面的值是一模一样的,只是在定点整数和定点小数中,对应位置的“位权”不同而已。

也就是说,在计算机看来,不管是对于定点整数还是定点小数,都是用同一套逻辑来处理的,只是人为解读的对应位置的位权不同而已。

4.定点小数中的原码,反码和补码

•原码

定点小数的原码,数值部分能表示的最大值为 全1 ,即2^-1+2^-2+2^-3....,利用等比数列求和公式,则数值部分最大为1-2^{-n}

再结合前面的符号位,得到定点小数的表示范围:

-(1-2^{-n})\leq x\leq 1-2^{-n}

最大的数:

0,111....111=1-2^{-n}

最小的数:

1,111....111=-(1-2^{-n})

定点小数原码对真值0的表示同样有两种:

[+0]原 = 0,000...000

[-0]原 = 1,000...000

•反码

定点小数的表示范围:

-(1-2^{-n})\leq x\leq 1-2^{-n}

最大的数:

0,111....111=1-2^{-n}

最小的数:

1,000...000=-(1-2^{-n})

定点小数原码对真值0的表示同样有两种:

[+0]反 = 0,000...000

[-0]反 = 1,111...111

•补码

合法的表示范围:

重要-1\leq x\leq 1-2^{-n}

最大的数:

0,111....111=1-2^{-n}

最小的数:

重要:1.000...000=-1

和定点整数的补码相同,这个特殊的值无法用定点小数的原码表示出来。

真值0的表示:

[0]补 = 0,000...000,真值0只有一种补码。

对比定点整数和定点小数:

5.定点小数的位置扩展

定点整数和定点小数还有一个很重要的区别,就是位置扩展时,两者的拓展位置不同。来看下面的例子,由于定点小数的小数点在符号位的后面,所以当4bit要拓展为8bit时,是在二进制数的最后进行扩展:

对于定点整数,如果要将4bit拓展为8bit,则需要在符号位后面进行拓展:

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

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

相关文章

SpringMVC枚举类型字段处理

在日常的项目开发中经常会遇到一些取值范围固定的字段,例如性别、证件类型、会员等级等,此时我们可以利用枚举来最大程度减少字段的乱定义,统一管理枚举的值。 SpringMVC中对于枚举也有默认的处理策略: 对于RequestParam&#xf…

【用Python画画】六一儿童节画爱心

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢! 文章目录 一、前言二、代码示例三、知识点梳理四、总结 一、前言 本文介绍如何使用Python的海龟画图工具turtle&#xf…

Redis 线程模型

Redis 线程模型 背景简介Redis 单线程客户端发起 Redis 请求命令的工作原理单线程面临的挑战及问题 Redis 多线程Redis v4.0 多线程命令Redis v6.0 多线程网络模型 总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术…

DNS设置(linux)

1.配置dns需要现在/etc/sysconfig/network-scripts/目录下的ifcfg-ens33(后面数字也可能是其他的)中配置DNS 2.编辑/etc/resolv.conf文件,将上面网卡中加的dns服务器ip添加到此文件 vi /etc/resolv.conf重启网络配置 service network restart常用的dns的ip 国内…

Flutter-自定义可展开文本控件

Flutter 在移动开发中,常常需要处理一些长文本显示的场景,如何优雅地展示这些文本并允许用户展开和收起是一个常见的需求。在本文中,我将分享如何使用Flutter实现一个可展开和收起的文本控件。 效果 我们将实现一个可展开和收起的文本控件…

JVM学习-详解类加载器(二)

双亲委派机制 双亲委派优势 避免类的重复加载,确保一个类的全局唯一性 Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层次关系可以避免类的重复加载,当父类已经加载了该类,就没有必要子ClassLoader再加载…

Three.js——tween动画、光线投射拾取、加载.obj/.mtl外部文件、使用相机控制器

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

低代码开发平台(Low-code Development Platform)的模块组成部分

低代码开发平台(Low-code Development Platform)的模块组成部分主要包括以下几个方面: 低代码开发平台的模块组成部分可以按照包含系统、模块、菜单组织操作行为等维度进行详细阐述。以下是从这些方面对平台模块组成部分的说明: …

计算机系统结构之FORK和JOIN

程序语言中用FORK语句派生并行任务,用JOIN语句对多个并发任务汇合。 FORK语句的形式为FORK m,其中m为新领程开始的标号。 JOIN语句的形式为JOIN n,其中n为并发进程的个数。 例1:给定算术表达式ZEA*B*C/DF经并行编译得到如下程序…

什么是 Redis 缓存?它解决了什么问题?怎么使用它?

前言 写在前面,让我们从 3 个问题开始今天的文章:什么是 Redis 缓存?它解决了什么问题?怎么使用它? 在笔者近 3 年的 Java 一线开发经历中,尤其是一些移动端、用户量大的互联网项目,经常会使用…

数学建模 —— 层次分析法(2)

目录 一、层次分析法(AHP) 二、构造比较判断矩阵 2.1 两两比较法 三、单准则下的排序及一致检验 3.1 单准则下的排序 3.2 一致性检验 四、层次总排序 4.1 层次总排序的步骤 4.2 总排序一致性检验 一、层次分析法(AHP) 方…

Centos 7部署NTP

介绍 NTP是Network Time Protocol(网络时间协议)的简称,它是用来通过互联网或局域网将计算机时钟同步到世界协调时间(UTC)的协议。 安装 # yum安装 yum install -y ntp# 离线安装 #下载地址:https://mir…

Caliburn.Micro框架学习笔记——多页面处理案例

在聊这个之前,我们先来看一个静态类 在 Caliburn.Micro 中,ViewLocator 是一个用于查找和关联视图与视图模型的静态类。默认情况下,它根据约定(命名约定或其他规则)自动找到与视图模型相对应的视图。然而,…

【5】MySQL数据库备份-XtraBackup - 全量备份

MySQL数据库备份-XtraBackup-全量备份 前言环境版本 安装部署下载RPM 包二进制包 安装卸载 场景分析全量备份 | 恢复备份恢复综合 增量备份 | 恢复部分备份 | 恢复 前言 关于数据库备份的一些常见术语、工具等,可见《MySQL数据库-备份》章节,当前不再重…

【普通切换】【DC-based handover】【DAPS】协议栈分析

移动网络切换 移动通信中切换是保证终端业务的基本流程,而切换时延是终端(UE)不能与任何基站交互(传递)用户面数据包的最短时间。 在5G(NR)网络中当终端(UE)接收到切换命令时,将断开与源小区的连接向目标小区发起随机接入过程。在此期间终端(UE)的数据传…

深入理解linux文件系统与日志分析12

一、inode和block 文件是存储在硬盘上,硬盘上的最小存储单位是扇区,每个扇区的大小是512字节。 inode:存储元信息(文件的属性--权限、创建者、创建日期等等) block:块 连续的八个扇区组成一个块&#xf…

rpmbuild多进程批量编译脚本

脚本用法 使用手册 bash spec.sh --help Please ensure the directory ~/rpmbuild exists, And the script can execute in any directory.Usage: bash spec.sh [OPTION]... [*.spec]... [OPTION]...or: bash spec.sh [*.spec]... [OPTION]... [*.spec]... rpmbuild all sp…

【原型模式】详解

一.概念 原型模式是一种创建型设计模式,它的主要思想是通过复制现有对象来创建新对象,而不是通过实例化一个类来创建。在原型模式中,我们称被复制的对象为原型(Prototype),新创建的对象为克隆体&#xff0…

【OpenHarmony】TypeScript 语法 ③ ( 条件语句 | if else 语句 | switch case 语句 )

文章目录 一、条件语句1、if else 语句2、switch case 语句 参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍 一、条件语句 1、if else 语句 TypeScript 中的 if 语句 / if else 语句 用法 , 与 JavaScript 语言中的 if 语句 / if else 语句 语法 基本相同 ; if else 语…

.gitignore 文件

一.什么是 .gitignore 文件 在任何当前工作的 Git 仓库中&#xff0c;每个文件都是这样的&#xff1a; 追踪的&#xff08;tracked&#xff09;- 这些是 Git 所知道的所有文件或目录。这些是新添加&#xff08;用 git add 添加&#xff09;和提交&#xff08;用 git commit 提…