C语言浮点型数据在内存中的存储及取出等的介绍

2024-04-27 21:52

本文主要是介绍C语言浮点型数据在内存中的存储及取出等的介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、浮点型在内存中的存储
  • 二、浮点数存储规则
  • 三、浮点数在内存中的存储(32位)float类型
  • 四、浮点数在内存中的存储(64位)double类型
  • 五、指数E从内存中取出分成三种情况
    • 1. E不全为0或不全为1
    • 2. E全为0
    • 3. E全为1
  • 六、有关案例
  • 总结


前言

C语言浮点型数据在内存中的存储及取出、有关案例等的介绍

一、浮点型在内存中的存储

  • 浮点型数据的范围是在 float.h 头文件中定义的。
  • 整型的数据的范围是在 limits.h 头文件中定义的。

二、浮点数存储规则

  • 浮点数的二进制位中,小数点后面数字的权重从2-1 ----> 2-2 ------>…等逐渐变化。

  • 因此若表示5.5 则二进制表示方法位 101.1, 即为5.5。

  • 但是,若表示5.6,101.11大于5.6, 101.101也大于5.6。

  • 所以表示5.6 需要很多位0或1来凑,所以浮点数不能精确表示有些值,只能近似表示。
    在这里插入图片描述

  • IEEE 754 规定

  • 任何一个浮点数都可以表示成 -1S × M × 2E

  • S 若为0, 则为正数,若为1,则为负数

  • E指的是把M表示成科学计数法,小数点移动的位数, 类似于10进制科学计数法

  • M是一个 大于等于1并且小于 2 的数字

  • 所以浮点数在内存中存储的是 S M E 相关的值

三、浮点数在内存中的存储(32位)float类型

  • 最高位存储 S符号位
  • 中间8位存储E的值
  • E 是一个无符号整型的值float类型范围为0 - 255,但是实际情况中E的值可能为负
  • 所以 标准规定,存入E的值时,用 E 的值 加 中间数来进行修正
  • float 类型的中间数是 127.
  • M 是有效数字在1 - 2 之间
  • 但是存储时,只存储小数点后面的,不存储1,在使用时加上1即可。

四、浮点数在内存中的存储(64位)double类型

  • 最高位存储 S 即符号位
  • 中间11位存储E的值
  • E 是一个无符号整型的值double类型范围为0 - 2047,但是实际情况中E的值可能为负
  • 所以 标准规定,存入E的值时,用 E 的值 加 中间数来进行修正
  • double 类型的中间数是 1023.
  • M 是有效数字在1 - 2 之间
  • 但是存储时,只存储小数点后面的,不存储1,在使用时加上1即可。

在这里插入图片描述

五、指数E从内存中取出分成三种情况

1. E不全为0或不全为1

  • 这是浮点数就采用如下规则
  • 指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位1。
  • 例如
5.5 二进制位 101.1
表示成标准形式为 -1^0 * 1.011 * 2^2
- 存入数据时:存入S 为 0存入的E为 2 + 127 = 129 二进制为 10000001存入M为 011 但需要在后面进行补0,至23位或52位即 01100000000000000000000所以存入的数据表示为0 10000001 01100000000000000000000E 的部分不全为0 或不全为1
- 取出数据时:S 不变 S = 0E 由存入的计算值减127得到真实值 2 M 加上 11.01100000000000000000000所以取出为-1^0 * 1.01100000000000000000000 * 2^2 // 5.5

2. E全为0

  • 存入的E 全为0,则说明,标准形式中2 的指数非常接近 -127,说明此时的数字非常小。
  • 所以标准规定 此时 E1-127(或1 - 1023)M不再加上第一位的1,而是直接还原为0.xxxxxxx,表示**±0以及接近于0的很小的数字**。

3. E全为1

  • 存入的E 全为1,则说明,标准形式中2 的指数非常接近 128,说明此时的数字非常大。
  • 这时,如果有效数字M全为0, 表示±无穷大(正负取决于S)。

六、有关案例

#include <stdio.h>
int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为: %d\n", n); // 9// 9 的二进制序列为// 00000000000000000000000000001001// 以浮点型取出// 0 00000000 00000000000000000000100// E 全为0 结果为 0.000000// 以浮点型进行存储// -1^0 * 1.001 * 2^3// 0 10000010 00100000000000000000000// 以整型打印// 01000001000100000000000000000000 // 一个很大的数// 以浮点型打印// -1^0 * 1.001 * 2^3 // 9.0printf("*pFloat的值为: %f\n", *pFloat);// 0.000000*pFloat = 9.0;printf("num的值为: %d\n", n); // 1091567616printf("*pFloat的值为: %f\n", *pFloat); // 9.000000return 0;
}

总结

C语言浮点型数据在内存中的存储及取出、有关案例等的介绍

这篇关于C语言浮点型数据在内存中的存储及取出等的介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

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

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

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中