C语言详解|float类型 数据的储存的存储方式详解
文章目录
- 浮点数的储存规则
- 浮点数在内存中的储存方式
- 有效数字M部分
- 指数E部分
- E全不为0 或者 E 全不为1
- E全是0
- E全是1
浮点数的储存规则
浮点数与实型数据的存储方式是不同的
num 和 *pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?
还是要关注计算机内部的储存方式
浮点数在内存中的储存方式
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。
IEEE 754规定:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
IEEE 754对有效数字M和指数E,还有一些特别规定。
有效数字M部分
1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxxz这部分。比如保存1.01的时候,只保存01,等到读取取出的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位float类型为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字
指数E部分
至于指数E,情况就比较复杂。
**首先,**E为一个无符号整数(unsigned int)
这意味着,如果E为8位,它的取值范围为0255;如果E为11位,它的取值范围为02047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
然后,指数E从内存中取出还可以再分成三种情况:
E全不为0 或者 E 全不为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的很小的数字。
E全是1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);
C语言详解|float类型 数据的储存的存储方式详解相关推荐
- VS Code写C语言输出long double类型数据不正确的问题
VS Code写C语言输出long double类型数据不正确的问题 在学习<C Primer Plus>一书时遇到一个例题 #include <stdio.h>int mai ...
- Android数据的四种存储方式
很清晰的思路,转自Android数据的四种存储方式 作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQL ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...
ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...
- 用C语言解“混合类型数据格式化输出”题
7-6 混合类型数据格式化输入 本题要求编写程序,顺序读入浮点数1.整数.字符.浮点数2,再按照字符.整数.浮点数1.浮点数2的顺序输出. 输入格式: 输入在一行中顺序给出浮点数1.整数.字符.浮点数 ...
- 7-7 硬币找钱问题 (10 分)(思路+详解+double类型数据的处理)Come baby!!!!!!!!!!!!!!!!!!!!
一:题目 设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元.现要用这些面值的硬币来购物.在购物中希望使用最少个数硬币.例如,1 次购物需要付款0.55 元,如果 ...
- java 内存分布_java的各类型数据在内存中分配情况详解_
1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...
- 数据结构图,图存储结构详解
1. 数据结构的图存储结构 我们知道,数据之间的关系有 3 种,分别是 "一对一"."一对多" 和 "多对多",前两种关系的数据可分别用线性 ...
- 大端小端存储方式详解
大端方式:用存储器的低字节地址单元来存放数据的最高字节 小端存放:用存储器的低字节地址单元来存放数据的最低字节 注: 在存储器中,左边的字节地址单元低于右边的字节地址单元,字节地址单元一般由八位二进制 ...
- 图片或者其他文件在数据库的存储方式详解
关于图片或者文件在数据库的存储方式归纳 商品图片,用户上传的头像,其他方面的图片.目前业界存储图片有两种做法: 1. 把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数 ...
最新文章
- Monkey环境配置
- 10使用CSS美化页面
- SQL Server 2012笔记分享-49:理解数据库快照
- 分享Kali Linux 2016.2最新镜像20160919
- python requests 重新定向错误 requests.exceptions.TooManyRedirects: Exceeded xx redirects 解决方法
- 26 进程优先级队列Queue
- linux-linux top 命令各参数详解
- vxworks 学习和windows azure 学习
- EMNLP 2019中和BERT相关的一些论文介绍
- ASP.NET Core 中间件分类
- linux注册平台驱动,关于Linux驱动的平台注册方式-- platform_driver_register
- python图书管理系统
- 多路复用实现单服百万级别RPS吞吐
- Knockout.Js官网学习(event绑定、submit绑定)
- 【数学建模】基于matlab模拟十字路口车辆通行【含Matlab源码 1106期】
- securecrt下载和注册方法
- caffe c++实战:通过训练好的模型对人脸图像进行特征提取(单张图像)
- apkg格式怎么打开_pdf怎么转换成word?妙招在手,转换不愁!
- 千与千寻主题曲beep函数版
- (翻译)测试替身— Fakes, Mocks 和 Stubs