[C语言]浮点型在内存中的存储

2023-11-10

        在上一篇文章,我们讲述了整型在内存中的存储,这篇文章我们就一起来看一下“浮点型在内存中的存储”

        回顾:整型在内存中的存储[C语言]和我一起来认识“整型在内存中的存储”_HY_PIGIE的博客-CSDN博客

目录

        1.浮点数家族

         2.整型和浮点型的存储方式的不同

          3.浮点型的存储方式

                3.1浮点数存储规则


        1.浮点数家族

        浮点数的类型有:

                float

                short

                long short

        

         2.整型和浮点型的存储方式的不同

         浮点型的存储方式和整型的存储方式大不相同,所以大家要抛弃整型的存储方式来看待浮点型的存储方式。

        下面通过一个举例来说明,整型和浮点型的存储方式的不同。

        首先,我们可以知道int类型和float类型都是占4字节,当将a的地址强制转换成float*类型后,再解引用打印出来和通过打印整型的方式,所出来的结果是不相同的,间接的就可以证明了整型和浮点型的存储类型是不相同的

int main()
{
	int a = 9;
	float* pa = (float*) & a;
	printf("%f \n", *pa);
	printf("%d ", a);
	
	return 0;
}

          3.浮点型的存储方式

                3.1浮点数存储规则

                根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
                        (-1)^^{s}\ast M\ast 2^{E}


                        (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
                        M表示有效数字,1<=M<2。
                        2^E表示指数位。

                        举例说明:(浮点数存储的变量只有S、M和E,所以只存储这三个变量)

                IEEE 754规定:

                                对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

 

                                对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M

                IEEE 754对有效数字M和指数E,还有一些特别规定:
                前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。
                IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位
                浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。


                至于指数E,情况就比较复杂。
                首先,E为一个无符号整数(unsigned int)
                这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间
数是1023。
比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即
10001001

        在计算机内存中的存储形式:

float = 5.5

二进制存储方式:0100 0000   1011 0000   0000 0000   0000 0000
   
十六进制显示:     4 0         b 0         0 0         0 0

                 (我的机器为小端字节序存储,所以是以倒序呈现)
 

                 然后,指数E从内存中取出还可以再分成三种情况:
                E不全为0或不全为1
                这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
                比如:
                0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为
1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:

            0 01111110 00000000000000000000000
                E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于
0的很小的数字。0 01111110 00000000000000000000000
                E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);

 

                        

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[C语言]浮点型在内存中的存储 的相关文章

随机推荐

  • Vue中使用echarts实现仪表盘

    实现效果 echarts使用说明请查看 Vue中使用echarts实现常用图表总结 option配置 option tooltip formatter a br b c toolbox feature restore saveAsImage
  • @@位运算

    定义 将整数转换为二进制 按二进制位进行运算 运算符号 按位与 按位或 按位异或 lt lt 左移 gt gt 右移 14 gt 01110 19 gt 10011 14 19 00010 2 0则0 14 19 111111 31 1则1
  • 概率统计及其应用第三章知识总结_数学篇:概率论复习规划

    终于到了第一轮最后一个环节 概率论复习规划 复习到这里 我们接下来会面临3个困难 1 6月份期末考试 与复习时间会有冲突 2 捡芝麻丢西瓜 复习概率论 却忘了前面的知识 3 二战考生忙毕业 问题一 期末考试的目标 情况一 不保研 不出国 不
  • 计算机网络基础(十二)---网络层-外部网关路由协议

    文章内容概览 BGP协议 BGP Border Gateway Protocol 边际网关协议 BGP协议是运行在自治系统 AS 之间的一种协议 在一个网络管理机构下边的网络 都可以看做是一个AS 比如 公司网络 学校网络 为什么在AS之间
  • vue3 element plus 设置默认时间,全局挂载时间格式化方法

    首先是在工具包里封装时间格式化的方法 全局挂载时间格式化的方法 export function formatter thistime any fmt string var this new Date thistime var o any M
  • 【python】 无符号int、float、double与16进制字符串的互相转换 有符号int与16进制字符串的相互转换

    一 无符号int float double与16进制字符串的互相转换 import struct def intToHex num int转16进制 return hex num 2 upper def hexToInt hexString
  • 小程序中半屏打开其他小程序,开发者工具调试半屏

    前言 有需要是在当前小程序中 点击操作时 如果他没有注册会员 则强制去另一个小程序去注册会员 注册成功在返回 在这期间 打开另一个小程序是半屏来展示的 实现效果 在a小程序中半屏展示b小程序 半屏上方展示b小程序信息 打开的vconsole
  • Cocos2d-x 2.2.3 Android部署

    今天总结出来的部署流程 已经成功把自己的项目编译到android真机上 省去了安装ndk等步骤 环境 win7 64位 1 导入项目到eclipse 2 导入libcocos2dx 例子 C cocos2d x 2 2 0 cocos2dx
  • 【mac解决办法】PytorchStreamReader failed reading zip archive: failed finding central directory

    错误说明 预训练模型下载中断 导致模型不完整 不能正确读取 解决办法 将下载的不完整的模型文件删除 重新执行代码 自动将重新下载 注意 自己下载的模型导入该文件夹是不管用的 每次执行都会不同结尾的文件名 模型保存路径 Users 用户名 c
  • 软件测试项目【金融、银行、电商、商城】

    项目经验 案例一 项目时间 2016 08 2017 07 项目名称 小花钱包 Web 项目描述 项目介绍 这个产品产是互联网金融理财服务平台 既可以发起投标 也可以借款 提供定期理财 活期理财等多种产品 平台主要有投资人 借款人 系统录入
  • 【虹软24届校招正式批】本周算法&;开发第二波笔试来袭

    今日更新提醒 看过了招聘信息 快来用牛客直投官网吧 打call 一键直投 给自己多一次面试机会 赞 移动端 https mnowpick nowcoder com m m 立得空间 C 开发技术面 1 项目中的线程池问题2 指针引用区别3
  • 1.fastadmin之Log日志使用

    要开始用fastadmin做小程序的后台 怎么说 这个框架封装的很好 对于我这种新手渣渣不太友好 惆怅 首先来谈谈日志的使用吧 如何打个log 一 概念 1 在控制器中声明 use think Log 2 log的方法 一般我使用log w
  • Spring Cloud获取本机IP地址

    最新的Spring Cloud获取本机的IP地址的配置文件如下 eureka instance hostname spring cloud client ip address lease renewal interval in second
  • 用Langchain构建一个阅读助手

    LangChain 是一个强大的框架 可以简化构建高级语言模型应用程序的过程 01 什么是Langchain LangChain是一个强大的框架 旨在帮助开发人员使用语言模型构建端到端的应用程序 它提供了一套工具 组件和接口 可简化创建由大
  • STM32CubeM的搭建以及基于HAL库实现LED闪烁

    文章目录 一 STM32的开发环境的搭建 1 安装jdk环境 2 安装STM32CubeMX 3 安装固件库 4 安装MDK5软件 二 利用工具生成点亮LED灯的代码 三 MDK5生成 hex文件 四 程序烧录 五 运行结果 六 MDK5模
  • 基于SimGAN网络的人眼数据生成方法_SimGAN原理_参考代码

    注 此文为复现sim GAN 参考了一些论文 博客 如有侵权请联系 我附上原出处 由于一些格式原因 文章有些部分会比较乱 请见谅 Learning from Simulated and Unsupervised Images through
  • 5个你不可不知的IE的bug及其解决方案

    E令人咬牙切齿的bug不胜枚举 其中IE6更是臭名昭著 令人发指 这里总结出IE下最为严重的5个bug 及其应对方案 1 IE6下无法显示png格式的透明信息 这个bug是众多网页设计师的噩梦 虽然可以采用gif代替 但是gif的表现力实在
  • Ubuntu之Docker安装

    1 先卸载旧版 如果没有的话 就直接执行第二步 apt get remove docker docker engine docker io containerd runc 这个命令用于在 Ubuntu 和其他基于 Debian 的 Linu
  • qt 储存库

    手动添加 储存库要定位一个储存有QT在线安装镜像的地址 打开 http download qt io static mirrorlist 这个网址 显示了各国的qt镜像站点 点击 HTTP 最终进到 online repository ht
  • [C语言]浮点型在内存中的存储

    在上一篇文章 我们讲述了整型在内存中的存储 这篇文章我们就一起来看一下 浮点型在内存中的存储 回顾 整型在内存中的存储 C语言 和我一起来认识 整型在内存中的存储 HY PIGIE的博客 CSDN博客 目录 1 浮点数家族 2 整型和浮点型