深入理解OS--数值编码

信息的表示和处理

寻址和字节顺序

在这里插入图片描述
位于0x100处,int类型值0x01234567在大端和小端下的存储。
字符串的存储不受字节序影响。

移位

1.对左移,右边统一补0
2.对右移,分为算术右移,逻辑右移
算术右移下,左边补原最高有效位
逻辑右移下,左边补0
默认对有符号数采用算术右移,对无符号数采用逻辑右移。

无符号编码

x → = [ x w − 1 , x w − 2 , . . . , x 0 ] \overrightarrow{x} = [x_{w-1}, x_{w-2}, ... , x_0] x =[xw1,xw2,...,x0]
B 2 U w ( x → ) = ∑ i = 0 w − 1 ( x i ∗ 2 i ) B2U_{w}(\overrightarrow{x})=\displaystyle\sum_{i=0}^{w-1}(x_i*2^i) B2Uw(x )=i=0w1(xi2i)

1.给定一个w个二进制数组组成的序列,B2U_w是对此序列进行的一种解释,解释的结果是将w个二进制数组成的序列映射为一个数值。
2.B2U_w将每个长度为w的位向量映射为 [ 0 , 2 w − 1 ] [0,2^w-1] [0,2w1]中一个唯一的值。
U2B_w将每个 [ 0 , 2 w − 1 ] [0,2^w-1] [0,2w1]中的值映射为一个唯一的长为w的位向量。

补码编码

x → = [ x w − 1 , x w − 2 , . . . , x 0 ] \overrightarrow{x} = [x_{w-1}, x_{w-2}, ... , x_0] x =[xw1,xw2,...,x0]
B 2 T w ( x → ) = ∑ i = 0 w − 2 ( x i ∗ 2 i ) − x w − 1 ∗ 2 w − 1 B2T_{w}(\overrightarrow{x})=\displaystyle\sum_{i=0}^{w-2}(x_i*2^i) - x_{w-1}*2^{w-1} B2Tw(x )=i=0w2(xi2i)xw12w1

1.给定一个w个二进制数组组成的序列,B2T_w是对此序列进行的一种解释,解释的结果是将w个二进制数组成的序列映射为一个数值。
2.B2T_w将每个长度为w的位向量映射为 [ − 2 w − 1 , 2 w − 1 − 1 ] [-2^{w-1},2^{w-1}-1] [2w1,2w11]中一个唯一的值。T2B_w将每个 [ − 2 w − 1 , 2 w − 1 − 1 ] [-2^{w-1},2^{w-1}-1] [2w1,2w11]中的值映射为一个唯一的长为w的位向量。

3.补码的形象解释
有符号数在计算机中是以「补码」表示的,对负数其补码就是把关联正数的二进制全部取反再加 1,比如 -1 的二进制是把数字 1 的二进制取反后再加 1
在这里插入图片描述
在这里插入图片描述
4.为何有符号数采用补码表示?
如果负数不是使用补码的方式表示,则在做基本对加减法运算的时候,还需要多一步操作来判断是否为负数,如果为负数,还得把加法反转成减法,或者把减法反转成加法,这就非常不好了,毕竟加减法运算在计算机里是很常使用的,所以为了性能考虑,应该要尽量简化这个运算过程。

而用了补码的表示方式,对于负数的加减法操作,实际上是和正数加减法操作一样的。你可以看到下图,用补码表示的负数在运算 -2 + 1 过程的时候,其结果是正确的:
在这里插入图片描述
采用补码表示下,有符号数的加法可以采用简单的二进制位逐位相加的方式。补码减法也可变形为加法来操作。

类型转换

强制类型转换的结果保持二进制位不变,只是改变对这些位解释的方式。

浮点数

1.十进制浮点数转换为二进制
在这里插入图片描述
最后把「整数部分 + 小数部分」结合在一起后,其结果就是 1000.101。但是,并不是所有小数都可以用二进制表示,前面提到的 0.625 小数是一个特例,刚好通过乘 2 取整法的方式完整的转换成二进制。

如果我们用相同的方式,来把 0.1 转换成二进制,过程如下:
在这里插入图片描述
可以发现,0.1 的二进制表示是无限循环的。
由于计算机的资源是有限的,所以是没办法用二进制精确的表示 0.1,只能用「近似值」来表示,就是在有限的精度情况下,最大化接近 0.1 的二进制数,于是就会造成精度缺失的情况。

举个例子,二进制 1010.101 转十进制的过程,如下图:
在这里插入图片描述
2.科学记数法与规格化
比如有个很大的十进制数 1230000,我们可以也可以表示成 1.23 x 10^6,这种方式就称为科学记数法。
该方法在小数点左边只有一个数字,而且把这种整数部分没有前导 0 的数字称为规格化,比如 1.0 x 10^(-9) 是规格化的科学记数法,而 0.1 x 10^(-9) 和 10.0 x 10^(-9) 就不是了。

3.浮点数的二进制存储
如果二进制要用到科学记数法,同时要规范化,那么不仅要保证基数为 2,还要保证小数点左侧只有 1 位,而且必须为 1。
所以通常将 1000.101 这种二进制数,规格化表示成 1.000101 x 2^3,其中,最为关键的是 000101 和 3 这两个东西,它就可以包含了这个二进制小数的所有信息:
(1).000101 称为尾数,即小数点后面的数字;
(2).3 称为指数,指定了小数点在数据中的位置;

现在绝大多数计算机使用的浮点数,一般采用的是 IEEE 制定的国际标准,这种标准形式如下图:
在这里插入图片描述
这三个重要部分的意义如下:
(1).符号位:表示数字是正数还是负数,为 0 表示正数,为 1 表示负数;
(2).指数位:指定了小数点在数据中的位置,指数可以是负数,也可以是正数,指数位的长度越长则数值的表达范围就越大;
(3).尾数位:小数点右侧的数字,也就是小数部分,比如二进制 1.0011 x 2^(-2),尾数部分就是 0011,而且尾数的长度决定了这个数的精度,因此如果要表示精度更高的小数,则就要提高尾数位的长度;

用 32 位来表示的浮点数,则称为单精度浮点数,也就是我们编程语言中的 float 变量,而用 64 位来表示的浮点数,称为双精度浮点数,也就是 double 变量,它们的结构如下:

在这里插入图片描述
可以看到:
(1).double 的尾数部分是 52 位,float 的尾数部分是 23 位,由于同时都带有一个固定隐含位(这个后面会说),所以 double 有 53 个二进制有效位,float 有 24 个二进制有效位,所以所以它们的精度在十进制中分别是 log10(2^53) 约等于 15.95 和 log10(2^24) 约等于 7.22 位,因此 double 的有效数字是 15~16 位,float 的有效数字是 7~8 位,这些有效位是包含整数部分和小数部分;
(2).double 的指数部分是 11 位,而 float 的指数位是 8 位,意味着 double 相比 float 能表示更大的数值范围;

那二进制小数,是如何转换成二进制浮点数的呢?
我们就以 10.625 作为例子,看看这个数字在 float 里是如何存储的。
在这里插入图片描述

首先,我们计算出 10.625 的二进制小数为 1010.101。

然后把小数点,移动到第一个有效数字后面,即将 1010.101 右移 3 位成 1.010101,右移 3 位就代表 +3,左移 3 位就是 -3。

float 中的「指数位」就跟这里移动的位数有关系,把移动的位数再加上「偏移量」,float 的话偏移量是 127,相加后就是指数位的值了,即指数位这 8 位存的是 10000010(十进制 130),因此你可以认为「指数位」相当于指明了小数点在数据中的位置。

1.010101 这个数的小数点右侧的数字就是 float 里的「尾数位」,由于尾数位是 23 位,则后面要补充 0,所以最终尾数位存储的数字是 01010100000000000000000。

在算指数的时候,你可能会有疑问为什么要加上偏移量呢?

前面也提到,指数可能是正数,也可能是负数,即指数是有符号的整数,而有符号整数的计算是比无符号整数麻烦的,所以为了减少不必要的麻烦,在实际存储指数的时候,需要把指数转换成无符号整数。

float 的指数部分是 8 位,IEEE 标准规定单精度浮点的指数取值范围是 -126 ~ +127,于是为了把指数转换成无符号整数,就要加个偏移量,比如 float 的指数偏移量是 127,这样指数就不会出现负数了。

细心的朋友肯定发现,移动后的小数点左侧的有效位(即 1)消失了,它并没有存储到 float 里。

这是因为 IEEE 标准规定,二进制浮点数的小数点左侧只能有 1 位,并且还只能是 1,既然这一位永远都是 1,那就可以不用存起来了。

于是就让 23 位尾数只存储小数部分,然后在计算时会自动把这个 1 加上,这样就可以节约 1 位的空间,尾数就能多存一位小数,相应的精度就更高了一点。

那么,对于我们在从 float 的二进制浮点数转换成十进制时,要考虑到这个隐含的 1,转换公式如下:
在这里插入图片描述
举个例子,我们把下图这个 float 的数据转换成十进制,过程如下:
在这里插入图片描述

4.浮点数精度:0.1 + 0.2 == 0.3 ?
在这里插入图片描述
在这里插入图片描述
这两个结果相加就是 0.300000004470348358154296875:
在这里插入图片描述
所以,你会看到在计算机中 0.1 + 0.2 并不等于完整的 0.3

这主要是因为有的小数无法可以用「完整」的二进制来表示,所以计算机里只能采用近似数的方式来保存,那两个近似数相加,得到的必然也是一个近似数。

而我们二进制只能精准表达 2 除尽的数字 1/2, 1/4, 1/8,但是对于 0.1(1/10) 和 0.2(1/5),在二进制中都无法精准表示时,需要根据精度舍入。

我们人类熟悉的十进制运算系统,可以精准表达 2 和 5 除尽的数字,例如 1/2, 1/4, 1/5(0.2), 1/8, 1/10(0.1)。

当然,十进制也有无法除尽的地方,例如 1/3, 1/7,也需要根据精度舍入。

在这里插入图片描述

当E中全部为二进制1时,因为IEEE 标准规定单精度浮点的指数取值范围是 -126 ~ +127,此时计算出来255 - 127 = 128超出范围了。所以,此时:
(1).当尾数部分部分不全为0时,表示NaN。表示浮点数不存在。
(2).当尾数部分全为0时,表示正无穷(符号位为0)或者负无穷(符号位为1)。

当E中全部为二进制0时,因为IEEE 标准规定单精度浮点的指数取值范围是 -126 ~ +127,此时计算出来0 - 127 = -127超出范围了。所以,此时:
数值为: ( − 1 ) 符号位 ∗ ( 0 + 尾数位 ) ∗ 2 − 127 (-1)^{符号位}*(0+尾数位)*2^{-127} (1)符号位(0+尾数位)2127

1.从int转成float,数字不会溢出,但可能被舍入。
2.从int或float转成double,可保留精确数值
3.从double换成float,可能溢出为正无穷,负无穷。可能被舍入。
4.从float或double转成int,可能会溢出。值将向0舍入。
溢出体现在超出表示范围,舍入体现在稠密映射到稀疏下,无法精确的一一映射,但可映射到最接近的。

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

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

相关文章

OpenCvSharp从入门到实践-(03)像素

目录 像素 1、确定像素位置 2、获取像素的BGR值 3、修改像素的BGR值 像素 图像数字化是指用数字表示图像,每一幅数字图像都是有M行N列的像素组成的,其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别,这256个灰…

k8s中安装consul集群

一、准备知识 headless services一般结合StatefulSet来部署有状态的应用,比如kafka集群,mysql集群,zk集群等,也包括本文要部署的consul集群。 0、consul集群 consul集群的分布式协议算法采用的是raft协议,这意味着必…

折线图-line

业务组件调用代码 <template><lineCom :title"lineComProps.title" :legendDataList"lineComProps.legendDataList":FeatureList"lineComProps.FeatureList" :xAxisData"lineComProps.xAxisData":seriesMultipleFlag"l…

【后端】数据字典自动生成枚举

前言 随着我老板给我灌溉的思想,逐渐开始利用代码来完成一些重复性且没有创造性的工作(我变懒啦),当我发现数据字典可以生成枚举从而大大减少开发时间的时候,我意识到事情的重要性。 数据字典 我一开始在网上找各种代码生成器的框架,然后突然意识到,这个不就是简单的…

2022年MathorCup大数据竞赛B题北京移动用户体验影响因素研究求解全过程文档及程序

2022年MathorCup高校数学建模挑战赛—大数据竞赛 B题 北京移动用户体验影响因素研究 原题再现&#xff1a; 移动通信技术飞速发展&#xff0c;给人们带来了极大便利&#xff0c;人们也越来越离不开移动通信技术带来的各种便捷。随着网络不断的建设&#xff0c;网络覆盖越来越…

XIAO ESP32S3之套件简绍

很高兴收到柴火创客空间寄来的XIAO ESP32S3开发套件。 一、套件介绍 1、电路板部分 一块XIAO ESP32S3主板、一块摄像头接口板&#xff08;可接SD卡&#xff09;&#xff0c;一根2.4G天线。 2、配件部分 一根USB-A转TypeC数据线、一个USB3.0转TypeC转接头、一个SD卡读卡器&am…

vue中keep-alive的使用

什么是keep-alive&#xff1f; keep-alive是一个内置组件&#xff0c;用于缓存和管理组件的状态。 当 keep-alive包裹一个组件时&#xff0c;这个组件的状态将会被缓存起来&#xff0c;而不是每次重新渲染。这在多个视图之间切换时特别有用&#xff0c;可以避免重复的创建和销…

vue项目通过HBuilder打包成apk,实现apk自动更新下载

vue 项目通过 HBuilder 打包成 apk&#xff0c;实现 apk 自动更新下载 1、vue 项目通过 HBuilder 打包成 apk vue 项目在终端执行 npm run build 打包成 dist 文件&#xff0c;生成的 dist 文件在 项目根目录下 在 HBuilder 中 新建一个项目 默认选择 5APP 的默认模板项目…

springboot+vue智能企业设备管理系统05k50

智能设备管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xf…

linux 命令 sudo、su 命令

sudo命令详解 1、初识sudo sudo是linux下常用的允许普通用户使用超级用户权限的工具&#xff0c;sudo 用来执行需要提升权限&#xff08;通常是作为 root 用户&#xff09;的命令&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令&#xff0c;如halt&#xff…

spring boot的redis连接数过多导致redis服务器压力过大的一次问题排查

一、背景 在今天上午的时候&#xff0c;突然收到大量的sentry报错&#xff0c;都是关于redis连接超时的警告。 首先想到的是去查看redis的监控&#xff0c;发现那个时间段&#xff0c;redis的请求数剧增&#xff0c;cpu使用率和带宽都陡增双倍。 下面的是redis监控的cpu情况 …

无代码未来:智能、可视化、自动化的融合

无代码是一个相对较新的概念&#xff0c;不同的人群对其界定可能存在一定的差异。 对于IT专业人士和开发人员而言&#xff0c;无代码通常是指使用可视化界面和拖拽操作来构建应用程序的工具和平台。 无代码平台通过提供预先构建的组件和模块&#xff0c;使得开发人员可以通过简…

基于CW32F030单片机的便携式多功能测试笔

一、产品背景 在日常的硬件调试工作中&#xff0c;我们最常使用的仪器仪表可能就是万用表了&#xff0c;虽然万用表号称“万用”&#xff0c;但大部分时候&#xff0c;我们需要使用到的功能无非是电压测量和通断测量。 作为调试的“得力干将”&#xff0c;万用表有时候也会存…

Windows bat批处理zip打包排除bat文件自身不打包

功能&#xff1a;遍历文件&#xff0c;把文件打包成zip文件&#xff08;不打包 bat 自身文件&#xff09; 文件名&#xff1a; 文件打包成7z-zip包.bat echo off:: 来源&#xff1a;https://www.cnblogs.com/wutou/p/17348784.html :: Date: 2023/04/24 :: :: 使用说明&#…

歌手荆涛演唱的《春节回家》,一种情感的表达和文化的传承

歌手荆涛演唱的《春节回家》&#xff0c;一种情感的表达和文化的传承 春节回家&#xff0c;是中国传统文化中最为重要的传统节日之一&#xff0c;也是亿万华夏儿女最为期待的日子。每当春节临近&#xff0c;无论身在何处&#xff0c;人们都会收拾行囊&#xff0c;踏上归途&…

【5G PHY】5G SS/PBCH块介绍(四)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

策略算法与Actor-Critic网络

策略算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main 策略梯度 与前面的基于价值的算法不同&#xff0c;这类算法直接对策略本身进行近似优化。 在这种情况下&#xff0c;我们可以将策略描述成一个带有参数 θ θ θ的连续函数…

基于python的职位推荐系统的设计与实现

点我完整下载&#xff1a;基于python的职位推荐系统的设计与实现.docx 基于python的职位推荐系统的设计与实现 Design and implementation of a job recommendation system based on Python 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的与意义 5 1.…

HarmonyOS—ArkTS中@Observed和@ObjectLink装饰器的嵌套类对象属性变化【鸿蒙应用开发】

文章目录 ARKTS中@Observed和@ObjectLink装饰器的嵌套类对象属性变化@Observed 类装饰器说明装饰器参数类装饰器的使用@ObjectLink 变量装饰器说明装饰器参数同步类型允许装饰的变量类型被装饰变量的初始值举例装饰器的限制条件观察变化和行为表现观察的变化框架行为使用场景1.…

WebUI自动化学习(Selenium+Python+Pytest框架)002

新建项目 New Project 新建一个python代码文件 file-new-python file 会自动创建一个.py后缀的代码文件 注意:命名规则,包含字母、数字、下划线&#xff0c;不能以数字开头&#xff0c;不能跟python关键字或包名重复。 ********************华丽分割线********************…