C语言 ——— 浮点数类型 在 内存中 的 存储模式

目录

浮点数存储规则

单\双精度浮点数 存储 S、M、E 的布局

有效数字M 和 指数位E 的特殊规定 

浮点数在内存中是否存储的S、M、E 


浮点数存储规则

根据国际标准IEEE754(电气和电子工程协会)规定:任意一个 浮点数F的二进制 都可以表示成以下形式:科学计数法

(-1)^S * M * 2^E


解析科学计数法: 

1.解析:(-1)^S

(-1)^S 表示的是 浮点数F符号位

S = 0 时,原式 = (-1)^0 =  1,此时的  1 就表示 浮点数F正数

S = 1 时,原式 = (-1)^1 = -1,此时的 -1 就表示 浮点数F负数

2.解析:M 

M 表示 有效数字,且 M 的取值范围是:M >= 1 && M < 2

3.解析:2^E

2^E 表示 指数位E 的取值为:有效数字M小数点 移动位数


举例说明:浮点数5.5 如何表示成 科学计数法

1.十进制的浮点数5.5 如何转换为 二进制:

整数部分的   5 转换为 二进制 为:101   --->   1*2^2 + 0*2^1 + 1*2^0 = 4 + 0 + 1 = 5

小数部分的0.5 转换为 二进制 为: 0.1   --->   1*2^(-1) = 0.5

合并:浮点数5.5 转换成 二进制 为:101.1 

2. 浮点数5.5 表示为 科学计数法

F = 5.5 = (-1)^0 * 1.011 * 2^2 

其中:S = 0M = 1.011E = 2


单\双精度浮点数 存储 S、M、E 的布局

由以上结论可以得出:只要有 S、M、E 这三个数时,就能 还原浮点数F

所以 IEEE754规定:内存中存储浮点数 时,存储的是 S、M、E 这三个数

单精度浮点数存储 S、M、E 的布局:

最高位存储的是 符号位S,后面的 8个bit位 存储的是 指数位E,剩下的 23个bit位 存储的是 有效数字M 


单精度浮点数存储 S、M、E 的布局:

最高位存储的是 符号位S,后面的 11个bit位 存储的是 指数位E,剩下的 52个bit位 存储的是 有效数字M 


有效数字M 和 指数位E 的特殊规定 

有效数字M 的特殊规定:

M 的取值范围:M >= 1 && M < 2

那么 M 的表示形式:1.xxxxxxxx,其中 xxxxxxxx 为小数部分

所以 IEEE754 规定省去 小数点前面 的 1,在内存 中 只保存小数点后面 的 部分,等到 读取 的时候,再把 小数点前面 的 1 加上

举例说明:M = 1.011

那么在内存中只会存储 011,只有等到 读取时加上 小数点前面的 1 


指数位E 的特殊规定: 

IEEE754 规定指数位E 是一个 无符号整数(unsigned int )

但 指数位E 在实际情况下 会 有为 负数 的情况:

如:浮点数0.5 转换为 二进制为0.1

F = 0.5 = (-1)^0 * 1.0 * 2^(-1) ;此时的 指数位E 就为 -1

所以为了规避这种情况:

IEEE754 规定指数位E 存入内存时的真实值 必须再加上一个中间数

中间数值 的规定:

对于  8个bit的E(单精度浮点数)中间数是127

对于 11个bit的E(双精度浮点数)中间数是1023  


浮点数在内存中是否存储的S、M、E 

创建 浮点数变量,调试代码,查看 浮点数内存存储的模式即可

代码演示:

float f = 5.5f;

 代码解析:

浮点数默认为 double类型,所以要在 5.5 后面加一个 f,用来强调 5.5float类型 

浮点数f 表示为科学计数法:

f = 5.5 = (-1)^0 * 1.011 * 2^2 

S = 0

M = 1.011   --->   M只存储小数点后的有效位:011 

E = 2   --->   E+127 = 129(float为单精度浮点类型)

浮点数f 的 S、M、E 在内存中表示形式:

S = 0;转换为二进制:0

M = 011;

E = 129;转换为二进制:1000 0001(记住:E是无符号整数,所以最高位是有效位)

转换为内存示意图如下:

大小端存储的相关知识请见:C语言 ——— 大/小端存储模式的介绍及判断-CSDN博客 

那么 浮点数5.5十六进制的形式内存中小端字节序存储 为:00 00 B0 40 

代码验证:

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

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

相关文章

Java练习05

tip&#xff1a; 在Java中&#xff0c;^ 运算符是用于按位异或&#xff08;XOR&#xff09;操作的&#xff0c;而不是用于指数运算。 要进行指数运算&#xff0c;你需要使用 Math.pow() 方法。可以接收两个double类型的参数。 public static double pow(double a, double b)…

从 Pandas 到 Polars 二十九:在Polars中进行机器学习预处理

Polars中的机器学习 在最近的时间里&#xff0c;我将探索在Polars中进行机器学习&#xff08;ML&#xff09;可以走到多远。 除了ML模型外&#xff0c;scikit-learn还提供了许多数据预处理功能。让我们看看在Polars中进行一些这样的预处理是否值得。 最小-最大缩放示例 简单…

<数据集>铁轨缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;844张 标注数量(xml文件个数)&#xff1a;844 标注数量(txt文件个数)&#xff1a;844 标注类别数&#xff1a;3 标注类别名称&#xff1a;[Spalling, Squat, Wheel Burn] 序号类别名称图片数框数1Spalling3315522…

abc362(abcde)

A - Buy a Pen&#xff08;模拟&#xff09; 题意&#xff1a;输入红笔r元&#xff0c;绿笔g元&#xff0c;蓝笔b元&#xff0c;不喜欢c笔&#xff0c;求最少花多少钱能买到一支笔 分析&#xff1a;比较除了c笔之外的两根笔&#xff0c;取最小值 代码&#xff1a; #include…

【ProtoBuf】通讯录实现(网络版)

Protobuf 还常用于通讯协议、服务端数据交换场景。那么在这个示例中&#xff0c;我们将实现一个网络版本的通讯录&#xff0c;模拟实现客户端与服务端的交互&#xff0c;通过 Protobuf 来实现各端之间的协议序列化。 需求如下&#xff1a; 客户端可以选择对通讯录进行以下操…

达梦数据库 DISQL连接数据库与执行SQL、脚本的方法

DISQL连接数据库与执行SQL、脚本的方法 1.DISQL介绍2.DISQL连接数据库的方法2.1 本地连接2.2 远程连接2.3 CONN连接 3.执行SQL、脚本的方法3.1 通过DISQL登录后在字符界面3.2 启动DISQL时运行脚本3.3 进入DISQL后&#xff0c;通过start命令运行脚本3.4 使用EDIT命令编辑脚本 1.…

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表 一、数据库表空间和数据库之间的关系二、索引表空间和数据库之间的关系三、创建角色四、创建表空间目录五、创建表空…

23年阿里淘天笔试题 | 卡码网模拟

第一题 字典序最小的 01 字符串 解题思路&#xff1a; 模拟&#xff0c;统计遇到的连续的1的个数记为num&#xff0c;直到遇到0&#xff0c;如果k>num&#xff0c;直接将第一个1置为0&#xff0c;将遇到的0置为1&#xff0c;否则将第一个1偏置num-k个位置置为0&#xff0…

【中项】系统集成项目管理工程师-第3章 信息技术服务-3.1内涵与外延与3.2原理与组成

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

OV7670寄存器读出0x00或0xFF

文章目录 问题描述原因分析解决方案 问题描述 OV7670的输出图像异常&#xff0c;怀疑寄存器没有正确配置&#xff0c;在SignalTap中观察到SIO_D在读出阶段一直为高或低 寄存器读出0x00 寄存器读出0xFF 原因分析 在确保电源、时钟和读写时序没有问题的情况下&#xff0c;有…

PCB系统学习(1)--PCB印制电路板

PCB印制电路板 1.1PCB的定义1.2PCB的层叠结构1.2.1PCB单层板1.2.2PCB双层板1.2.3PCB四层板 1.3PCB的通孔&#xff0c;盲孔&#xff0c;埋孔1.4元器件的符号与封装1.5PCB的生产过程 1.1PCB的定义 PCB(PrintedCircuitBoard)&#xff0c;中文即印制电路板&#xff0c;或印刷线路板…

Linux--多线程

今日内容 线程的结束机制&#xff1a; 1.不同与进程没有孤儿线程和僵尸线程。 2.主进程结束&#xff0c;任意生成的次线程都会结束。(因为共享的进程空间被回收了)。 3.次线程的正常结束不会影响主线程的运行。 子线程的回收策略&a…

分布式ID是什么?有哪些解决方案?

在开发中&#xff0c;我们通常会需要一个唯一ID来标识数据&#xff0c;如果是单体架构我们可以通过数据库的主键&#xff0c;或直接在内存中维护一个自增数字来作为ID都是可以的&#xff0c;但对于一个分布式系统&#xff0c;就会有可能会出现ID冲突&#xff0c;此时有以下解决…

vue3大事件管理系统 === 首页 layout 文章分类页面 -

目录 首页 layout 架子 [element-plus 菜单] 基本架子拆解 登录访问拦截 用户基本信息获取&渲染 退出功能 [element-plus 确认框] 文章分类页面 - [element-plus 表格] 基本架子 - PageContainer 文章分类渲染 封装API - 请求获取表格数据 el-table 表格动态渲染 …

CDM大全

CMD&#xff08;Command Prompt&#xff09;是Windows操作系统中的命令行解释器&#xff0c;它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其功能说明&#xff1a; 文件和目录管理 dir&#xff1a;显示当前目录中的文件和子目录列表。cd&#xff1a;更改…

《0基础》学习Python——第十八讲__爬虫\<1>

一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序&#xff08;通常使用Python&#xff09;&#xff0c;爬虫可以自动化地访问网页&#xff0c;解析网页内容并提取出所需的数据。爬虫可以用于各种用途&#xff0c;如搜索引擎的索引&#xff0c;数据分析和挖掘&#x…

NVIDIA 完全过渡到开源 GPU 内核模块

目录 支持的 GPU安装程序更改将包管理器与 CUDA 元包配合使用使用 runfile使用安装帮助程序脚本包管理器详细信息apt&#xff1a;基于 Ubuntu 和 Debian 的发行版dnf&#xff1a;Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypper&#xff1a;SUSE …

怎么关闭 Windows 安全中心,手动关闭 Windows Defender 教程

Windows 安全中心&#xff08;也称为 Windows Defender Security Center&#xff09;是微软 Windows 操作系统内置的安全管理工具&#xff0c;用于监控和控制病毒防护、防火墙、应用和浏览器保护等安全功能。然而&#xff0c;在某些情况下&#xff0c;用户可能需要关闭 Windows…

光电传感器的详细介绍,包括其原理、结构、分类、应用以及技术发展趋势

光电传感器是一种利用光电转换原理&#xff0c;将光信号转换为电信号的传感器。它在工业自动化、物流、医疗、安全等领域有着广泛的应用&#xff0c;是实现各种检测、测量和控制功能的重要元件。以下是对光电传感器的详细介绍&#xff0c;包括其原理、结构、分类、应用以及技术…

【分布式事务】怎么解决分布式场景下数据一致性问题

分布式事务的由来 拿充值订单举个栗子吧&#xff0c;假设&#xff1a;原本订单模块和账户模块是放在一起的&#xff0c;现在需要做服务拆分&#xff0c;拆分成订单服务&#xff0c;账户余额服务。原本收到充值回调后&#xff0c;可以将修改订单状态和扣减余额放在一个mysql事务…