深入理解 C 语言中浮点型数据在内存中的存储

文章目录

  • 一、浮点型数据存储格式(IEEE 754 标准)
  • 二、举例说明单精度浮点数存储过程
  • 三、绘图说明
  • 四、双精度浮点数存储示例(以1.5为例)

在 C 语言的世界里,数据类型丰富多样,而浮点型数据用于表示实数,在科学计算、图形处理等众多领域都有着不可或缺的地位。然而,浮点型数据在内存中的存储方式相较于整型数据更为复杂,今天就让我们一同深入探索这一奥秘。

一、浮点型数据存储格式(IEEE 754 标准)

在 C 语言中,单精度浮点数(float)和双精度浮点数(double)遵循 IEEE 754 标准存储。这一标准像是一本精心编写的规则手册,确保了不同计算机系统间浮点型数据表示的一致性。
V = (−1) ∗ S M ∗ 2 E
• (−1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2 E 表⽰指数位
单精度浮点数(float)
单精度浮点数占据 4 个字节,也就是 32 位的存储空间。它被划分为三个部分:1 位符号位(S)、8 位指数位(E)和 23 位尾数位(M)。
双精度浮点数(double)
双精度浮点数则占用 8 个字节,即 64 位。同样由三部分构成:1 位符号位(S)、11 位指数位(E)和 52 位尾数位(M)。
存储规则详解
符号位(S):就像一个简单的开关,0 代表正数,1 代表负数。通过这个符号位,计算机能够轻松判断浮点型数据的正负。
指数位(E):采用偏移码表示。对于单精度浮点数,偏移量为 127;对于双精度浮点数,偏移量为 1023。实际指数e在存储时,会被转化为E = e + 127(单精度)或E = e + 1023(双精度)。例如,如果实际指数为 3,那么在单精度存储中,指数位存储的值就是3 + 127 = 130,对应的二进制为10000010。
尾数位(M):用于表示小数部分。值得注意的是,在规格化的浮点数中,小数点左边有一个隐含的 1。也就是说,在实际存储时,只保存小数点后的数字。例如,对于单精度浮点数,存储的是小数点后的 23 位数字,而在还原数值时,需要加上这个隐含的 1。

二、举例说明单精度浮点数存储过程

存储3.14(float)
转换为二进制小数:
整数部分3转换为二进制是11。
小数部分0.14的转换过程较为复杂,通过不断乘以 2 取整数部分的方法:
0.14×2 = 0.28,取整数部分 0;
0.28×2 = 0.56,取整数部分 0;
0.56×2 = 1.12,取整数部分 1;
0.12×2 = 0.24,取整数部分 0;
0.24×2 = 0.48,取整数部分 0;
0.48×2 = 0.96,取整数部分 0;
0.96×2 = 1.92,取整数部分 1…… 如此循环,得到0.14的二进制近似表示为00100011110101110000101。
组合整数和小数部分得到11.00100011110101110000101,进一步写成规格化形式为1.100100011110101110000101×2^1。
确定各部分数值:
符号位:因为3.14是正数,所以S = 0。
指数位:实际指数e = 1,存储的指数E = e + 127 = 128,二进制表示为10000000。
尾数位:去掉规格化形式小数点左边的 1,得到100100011110101110000101(23 位)。
得出内存存储形式:
所以3.14在内存中的存储形式为0 10000000 100100011110101110000101(从左到右依次为符号位、指数位、尾数位)。

三、绘图说明

假设有一个单精度浮点数(3.14),其在内存中的存储方式如下:

• 转换为二进制:

• (3.14)的二进制表示为(11.00100011110101110000101)。

• 规格化后,表示为(1.100100011110101110000101\times 2^1)。

• 确定各部分:

• 符号位:正数,为0。

• 指数位:实际指数值为1,存储的指数值为(1+127=128),二进制表示为(10000000)。

• 尾数位:小数部分为(100100011110101110000101)。

• 内存中的存储:

• 符号位:0

• 指数位:10000000

• 尾数位:100100011110101110000101

在这里插入图片描述

四、双精度浮点数存储示例(以1.5为例)

转换为二进制:整数部分是1,二进制为1;小数部分0.5×2 = 1,得到二进制为1.1,写成规格化形式为1.1×2^0。
确定各部分数值:
符号位S = 0(正数)。
实际指数e = 0,存储的指数E = e + 1023 = 1023,二进制为01111111111。
尾数位去掉隐含的 1 后为1(后面补 0 达到 52 位),即10000000000000000000000000000000000000000000000000000。
得出内存存储形式:
所以1.5在内存中的双精度存储形式为0 01111111111 1000000000000000000000000000000000000000000000000000(从左到右依次为符号位、指数位、尾数位)。
浮点型数据在内存中的存储方式虽然复杂,但它为我们在计算机中精确表示和处理实数提供了可能。通过深入理解这一存储方式,我们能够更好地优化代码,避免因浮点数运算带来的精度问题。希望这篇博客能帮助大家在 C 语言的学习中,对浮点型数据的存储有更清晰的认识。

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

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

相关文章

sql server cdc漏扫数据

SQL Server的CDC指的是“变更数据捕获”(Change Data Capture)。这是SQL Server数据库提供的一项功能,能够跟踪并记录对数据库表中数据所做的更改。这些更改包括插入、更新和删除操作。CDC可以捕获这些变更的详细信息,并使这些信息…

vue3如何使用bus(事件总线)

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

Spring IoC DI 入门 和 使用

Spring IoC & DI入门 和 使用 1. IoC & DI入门1.1 Spring 是什么?1.1.1 什么是容器?1.1.2 什么是IoC? 1.2 IoC介绍1.2.1 传统程序开发1.2.2 问题分析1.2.3 解决方案1.2.4 IoC程序开发1.2.5 IoC优势 1.3 DI介绍 2. IoC 和 DI使用 1. IoC & DI入门 1.1 Spring 是…

计算机网络(三)——局域网和广域网

一、局域网 特点:覆盖较小的地理范围;具有较低的时延和误码率;使用双绞线、同轴电缆、光纤传输,传输效率高;局域网内各节点之间采用以帧为单位的数据传输;支持单播、广播和多播(单播指点对点通信…

mapbox基础,style样式汇总,持续更新

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言二、🍀根属性2.1 so…

551 灌溉

常规解法&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k,t; const int N105; bool a[N][N],b[N][N]; int cnt; //设置滚动数组来存贮当前和下一状态的条件 //处理传播扩散问题非常有效int main() {cin>>n>>m>>t;for(int i1;i&l…

jenkins入门10--自动化构建

build periodically&#xff1a;设定类似cron周期性时间触发构建 * * * * * (五颗星&#xff0c;中间用空格隔开&#xff09; 第一颗表示分钟&#xff0c;取值0~59 第二颗表示小时&#xff0c;取值0~23 第三颗表示一个月的第几天&#xff0c;取值1~31 第四颗表示第几月&#xf…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…

新兴的开源 AI Agent 智能体全景技术栈

新兴的开源 AI Agent 智能体全景技术栈 LLMs&#xff1a;开源大模型嵌入模型&#xff1a;开源嵌入模型模型的访问和部署&#xff1a;Ollama数据存储和检索&#xff1a;PostgreSQL, pgvector 和 pgai后端&#xff1a;FastAPI前端&#xff1a;NextJS缺失的一环&#xff1a;评估和…

详细分析 Git 分支重命名与同步操作

目录 前言1. 场景2. 扩展知识 前言 以下小知识点作为讲解介绍&#xff0c;文章较短&#xff0c;作为科普使用 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. 场景 示例场景&#xff1a;决定将默认分支从 main…

vs2022开发.net窗体应用开发环境安装配置以及程序发布详细教程

文章目录 一、安装visual studio1.1推荐win10操作系统1.2推荐vs20221.3选择工作负载 二、新建基于.net的winform应用程序2.1为什么要.net 2.2 新建.net窗体应用2.2.1 选择Window窗体应用2.2.2 .net窗体对比framework窗体 三、发布.net应用 一、安装visual studio 1.1推荐win10…

Python基于YOLOv8和OpenCV实现车道线和车辆检测

使用YOLOv8&#xff08;You Only Look Once&#xff09;和OpenCV实现车道线和车辆检测&#xff0c;目标是创建一个可以检测道路上的车道并识别车辆的系统&#xff0c;并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 1、系统主要功能 车道检测&am…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner&#xff0c;最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…

tdengine数据库使用java连接

1 首先给你的项目添加依赖 <dependency> <groupId>com.taosdata.jdbc</groupId> <artifactId>taos-jdbcdriver</artifactId> <version>3.4.0</version> <!-- 表示依赖不会传递 --> </dependency> 注意&am…

vue3+ts+element-plus 对话框el-dialog设置圆角

对话框el-dialog设置圆角&#xff0c;实现的需求效果&#xff1a; 目前只能通过行内样式&#xff08;style"border-radius: 20px"&#xff09;来实现圆角效果&#xff1a;

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…

STL——二叉搜索树

目录 二叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 ⼆叉搜索树的删除 中序遍历结果为升序序列 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树 • 若它的左⼦树不为空&#…

网络-ping包分析

-a&#xff1a;使 ping 在收到响应时发出声音&#xff08;适用于某些操作系统&#xff09;。-b&#xff1a;允许向广播地址发送 ping。-c count&#xff1a;指定发送的 ping 请求的数量。例如&#xff0c;ping -c 5 google.com 只发送 5 个请求。-i interval&#xff1a;指定两…

工厂管理中 BOM(物料清单)

工厂管理中 BOM&#xff08;物料清单&#xff09;的一些优点&#xff1a; 1. 提高生产计划准确性 - 准确反映产品所需的物料及数量&#xff0c;为生产计划提供可靠依据&#xff0c;减少因物料估算错误导致的生产延误。 2. 优化成本控制 - 有助于精确计算产品成本&…

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…