float为什么要进行 移位存储或者说移位存储有什么好处?

2024-02-24 10:18

本文主要是介绍float为什么要进行 移位存储或者说移位存储有什么好处?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载:https://blog.csdn.net/michaelhan3/article/details/72802104

首先,我们假设不使用移位存储技术,而是单单看看这个 7位+1位组成的新字节,到底能表示多少个数,这个问题就太简单了,我想大家闭着眼睛都能查出来,没错是从

0000000 0 到 1111111 1结束。

也就是从0开始到 255结束,一共 256个数。

但是,我们知道这新组成的8位数是用来表示整串32位单精度浮点数的幂指数(阶码)的,而浮点数的幂指数(阶码)是有必要使用负数的,

大家都知道,当幂指数(阶码)为正时,整串32位单精度浮点数的小数点是向右移动的,表示的数的绝对值就大一些,同样我们在使用计算机时也需要使用到绝对值很小的数,因此,我们需要将整串32位数的小数点向左移动,从而将整串32位单精度浮点数的绝对值变的更小,那么就需要幂指数(阶码)为负数。

既然这个新生成的字节,既要表示正数,又要表示负数,因此我们要拿出一位来表示正负号,而且大家都知道,一般都是拿一个字串最左边的那位即最高位来表示正负号的,因此,我们也沿袭这个规矩,

而最高位(最左边那位)一般只有两个状态当为0时,剩下的7位可以表示的范围从0到127,当最高位(最左边那位)为1时,配合剩下的7位可以表示128到255,当然这里我们还是把这新字节的8位都用来表示数,而没有拿出1位来表示符号。

好的,既然我们拿出这个新字节的最高位(最左边的那位)来当符号位,而且看来很合适,那么我们来看看这个符号位,是用1来表示负数(常规做法)好不好,合理不合理。

首先,我们使用传统的方式,即一个字节的最高位(最左边那位)为1时表示负数,那么我们可以得到两个区间,这里我们为了看着方便还是使用空格来隔开最高位的符号位和最低位的那位特殊位:

第一个区间:0 000000 0~ 0 111111 1即+ 0 到 127,第二个区间:1 000000 0~ 1 111111 1即 -0 到 - 127,

大家看到这里发现问题了,怎么有两个零,一个正零,一个负零呢,好啦,我们再马上来看看使用移位存储方式会有什么效果,我们知道移位存储我们要加 127,为什么要加127,大家看看下面的例子就明白了,请看:

127 使用这个新生成的字节来表示,则是:

0 111111 1 

我们来多举几个例子,大家马上就明白了,请看:

如果我们要表示 0,则有 0+127=127 即 0 111111 1

0 000000 0 + 0 111111 1= 0 111111 1

我们要表示1,则有 1+127=128 即 1 000000 0

0 000000 1 + 0 111111 1= 1 000000 0

我们要表示 2,则有 2+127=129 即 1 000000 1

0 000001 0 + 0 111111 1= 1 0000001

………………………………………………………………//正数的符号位为1

我们要表示 128,则有 128+127=255 即 1 111111 1

1 000000 0+ 0 111111 1= 1 111111 1

这个128是我们能够使用 8位二进制移位存储算法表示的最大的正数了,再大就溢出了。 同样,我们来看看负数:

我们要表示 -1时,则有( -1) +127=127-1=126 即 0 111111 0

0 111111 1 - 0 000000 1= 0 111111 1

我们要表示 -2时,则有( -2)+ 127=127-2=125 即 0 111110 1

0 111111 1 - 0 000001 0= 0 111110 1

我们要表示 -127时,则有(-127)+127=127-127=0 即 0 000000 0

0 111111 1 - 0 111111 1= 0 000000 0

这-127,是我们能够使用 8位二进制采用移位存储所能表示的最小的负数了,再小就溢出。

………………………………………………………………//负数符号位为0

我们可以得出规律,采用移位存储技术,我们可以使用 8位二进制来表示从 -127~128 共计 127个负数+零(0)+128个正数总共 256个数,看来使用移位存储即没有+0和-0的问题,又充分的使用这个新生成的 8位二进制数来最大限度的表示单精度浮点数的幂指数(阶码),是非常合理的,只是这里大家需要注意,在使用移位存储技术时,得到的两个区间:

0 000000 0~ 0 111111 1

这里不严谨的称之为 0区间,在0区间内表示 -127~0 ,0包含在此区间。

0 000000 0表示的是 -127 而不是0,

0 111 111 1表示的是0 而不是 +127,

1 000000 0~ 1 111111 1

这里我们称之为 1区间,在1区间内表示的是 1~128,

所以,在使用移位存储技术的时候,这个8位新字节中最高位的符号位是1,表示的是正数,而当最高位的符号位是0时,表示的是0 和负数的集合。

 

这篇关于float为什么要进行 移位存储或者说移位存储有什么好处?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741782

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Java 继承和多态的作用及好处

《Java继承和多态的作用及好处》文章讲解Java继承与多态的概念、语法及应用,继承通过extends复用父类成员,减少冗余;多态实现方法重写与向上转型,提升灵活性与代码复用性,动态绑定降低圈复杂度... 目录1. 继承1.1 什么是继承1.2 继承的作用和好处1.3 继承的语法1.4 子类访问父类里面的成

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主