C语言中浮点型存储方式

2024-04-26 17:28
文章标签 语言 方式 存储 浮点

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

       前言

         这次是上次博客的续写哦,如果有小伙伴不了解,可以点击链接跳转

        C语言中整数与浮点数在内存中的存储

        我们在上次的博客中给大家留了一段代码,不知道大家现在有没有想明白呢,让我来为大家揭秘吧!!

        

int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("num的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);return 0;
}

        运行结果

        

        我们看着这个代码心中是有不少疑惑吧

        代码解析

        首先我们开辟一个名为n的内存空间用来存放数字9,大家注意,这个9是以整型的形式存放进去的,之后我们建立一个浮点型的指针名字叫pFloat,将n的地址交给pFloat,当然在将n的地址交给一个浮点型的指针的时候需要强制类型转化一下。

        当我们以将n以整型的方式拿出时,n的值为9(printf("n的值为:%d\n",n))这句话表示将n以整型的方式拿出。

        但是看看我们下一条代码,当我们将n的值以浮点数的视角取出来的时候,这个时候n的值变成了0.000000,那么在这个过程中发生了什么呢,可以说明什么问题呢?这两条代码可以证明,整数与浮点数在内存中的存储方式是不一样的,这样我们取出它们的数据才会有区别。

        如果大家觉得这样还不够,我们再继续往下看。

        我们以浮点数的形式将9.0放入pFloat,之后我们在整型的视角使用%d取出n中的数值,我们发现,n变成了一个很大的值。但是当我们使用浮点数的形式将n拿出的时候,n还是9.000000。

        整型和浮点型在内存中存储的区别

        那么我们来看看具体在内存中是怎么存储的吧

        int n=9;

        这条代码是将n以整型的形式放入内存中,那么这里放入n的补码

        n的补码:00000000 00000000 00000000 00001001

        我们将n以浮点数的形式拿出

        n的浮点数形式:0 00000000 00000000000000000001001

        我们根据IEEE 754,写出它的标准形式

        n=(-1)^0*0.00000000000000000001001*2^*-126

        这里要注意喽,为什么后面的指数是-126呢,这是我们上一篇讲到的E全为0的特殊情况,当E全为0的时候,浮点数的指数E等于1-127既为真实值,所以我们这里E的指数为-126。

        这个数字的有效数字M的值为0.00000000000000000001001,之后还要乘2^-126,所以结果是一个无限接近与0的数字,我们取小数点后6位那么这里就是0.000000。

        我们再来看看* pFloat = 9.0

        我们将9.0以浮点型的方式存储在内存中

        首先我们来看看9.0的二进制是多少

        1001.0

        1.001*2^3

        (-1)^0*1.001*2^3

        所以这里我们

        S = 0

        M = 1.001

        E = 3    3+127 = 130

        这里我们存储的就是

        0 10000010 00100000000000000000000

        当我们以浮点数的方式取出时,结果就是9.0

        当我们将浮点数存入的数据看作是整型存放的数据时,就会出现代码运行之后的很大的数值

        整型存储

        01000001 00010000 00000000 00000000

        那么这样我们在取出的时候就会发现符号位为0,这个数就是二进制补码,直接读取数值,得到结果,之后我们通过计算机验证,得到的结果果然和程序运行结果相同。

        计算机验证结果

        

        那么到这里大家是不是已经明白,整型和浮点型在内存中存储方式的区别啦,希望可以帮助到大家,加油加油!!

        

        

这篇关于C语言中浮点型存储方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren