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

相关文章

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

MySQL中存储过程(procedure)的使用及说明

《MySQL中存储过程(procedure)的使用及说明》存储过程是预先定义的SQL语句集合,可在数据库中重复调用,它们提供事务性、高效性和安全性,MySQL和Java中均可创建和调用存储过程,示例展... 目录概念示例1示例2总结概念存储过程:在数据库中预先定义好一组SQL语句,可以被程序反复调用。

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red