杂谈c语言-6.存储浮点数

1.存储内存中浮点数。
常⻅浮点数:3.14159、1E10等等c;浮点数家族包括:float、double、long double。类型。 浮点数表⽰范围: float.h 中定义。
1.1 练习 。
#includeint main(){ int n = 9; float* pFloat = (float*)&n; printf("n的值a;%d\n", n); printf("*pfloat的值为:%f\n", *pFloat); *pFloat = 9.0; printf("num值为:%d\n", n); printf("*pfloat的值为:%f\n", *pFloat); return 0;}。
什么输出?
答案是:
。
1.2 存储浮点数。
上⾯在代码中, num 和 *pFloat 内存显然是一样的⼀个数,为什么浮点数和整数的解释结果不同? 这么⼤?
要理解这个结果,⼀计算机内部的浮点数表必须理解⽰⽅法。。 IEEEð电⽓和电⼦⼯程序协会)754,任意⼀个⼆进制浮点数V可以表⽰成下⾯形式:
例子说明:
5.5#xff08;十进制)==101.1(二进制),转化为二进制的科学计数法是。1.011*2二次方。
就相当于。(-1)0次方*1.011*102次方。
因此:
S==0;
M==1.011;
E==2;
存储浮点数,存储S,M,E相关的值 !!!!!!
EEE754规定
1.对于。浮点数为32位。,最⾼一位存储符号位S。,接下来的8位存储指数E。,剩下的23位存储有效数字M 。
float类型浮点数内存分配。
2.对于。64位浮点数。,最⾼一位存储符号位S。,然后是11位存储指数E。,剩下的52位存储有效数字M。
double类型浮点数内存分配。
2.浮点数存储过程。
1.EEE754对有效。数字M。和。指数E。,还有⼀一些特殊规定。
前⾯说, 1≤M<2,也就是说,M可以写成 1.xxxxxx 的形式。,其中 xxxxxx 表⽰⼩数部分。 IEEE754规定,M时保存在计算机内部c;默认这个数字的第一个⼀总是1所以可以放弃(即1不存储));,只保存后⾯的 xxxxxxx部分!!!!!!!!!!!!!!!!!!!!!!!!!!!。⽐保存1.01时,保存01,等到阅读时,再把第⼀加上位1。
这样做的⽬ ,是。节省一个有效的数字。。以32位浮点为例只有23个留给Mc;将第⼀放弃位置1后,等于可以保 存储24位有效数字。
2.⾄于。指数E。,情况就⽐较复杂 。
⾸首先,E为⼀个。⽆符号整数(unsigned int)
这意味着1.如果E为8位其值范围为0~255;2.如果E为11位,其值范围为0~2047。但是,我 知,E在科学计数法中。负数可以出现。
例:
0.5(十进制)==0.1(二进制)==1.0*2的。-一次方,这就产生了负数!!!!
因此,IEEE754规定存⼊E在内存中的真实值。必须再加上 ⼀中间数:
1.对于8位E,这个中间数是。127。;
2.11位E,这个中间数是。1023。。
⽐例如,2^10的E是 10,因此,当保存成32位浮点时,必须保存成10Ʊ127=137,即10001001。
3.浮点数取的过程 。
指数E也可以从内存中取出。再分为三种情况:
1.。E不全为0或不全为1。
此时,浮点数就采⽤下⾯的规则表⽰,
1.指数E的计算值。减去127(或者1023),获得真实值。
2.再将有效 数字M前。加上第⼀位的1。
⽐如:0.5的⼆0.1的进制形式c;因为规定正数部分必须是1,即将⼩数点右移1位,1.0*2^(-1)༌其 阶码为。-1+127(中间值=126。,表⽰0111110,⽽尾数1.0去除整数部分0,补⻬0到23位 00000000000000000000000,则其⼆进制表⽰形式为:。
0 01111110 00000000000000000000000。
2.E全为0 。
此时,指数E等于浮点数。1-127(或者1-1023)!!!!!!!!!!!!!!!即真实值,有效数字M。不再加上第⼀位的1。,⽽是。还 原为0.xxxxxxx⼩数。。
这样做是为了。表⽰±0,而且非常接近0⼩的数字。!!!!!!!!!!!!!
0 00000000 00100000000000000000000。
3.E全为1。
此时,所有有效的数字M都是0,表⽰±⽆穷⼤(正负取决于符号位s);
1 0 11111111 00010000000000000000000。
4.题目解析 。
#includeint main(){ int n = 9; float* pFloat = (float*)&n; printf("n的值a;%d\n", n); printf("*pfloat的值为:%f\n", *pFloat); *pFloat = 9.0; printf("num值为:%d\n", n); printf("*pfloat的值为:%f\n", *pFloat); return 0;}。
。
1.n内存中的补码是。
0000 0000 0000 0000 0000 0000 0000 1001。
但是pfloat取数据的时候是。按浮点数的方式取。,即。
⾸先,将 9 的⼆以浮点数的形式拆分进制序列,得到。
1.第⼀位符号位。s=0。
2.后⾯8位的指数。E=00000000 。
3.最后23位的有效数字。M=00000000000000000001001。。
V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146) 。
E全部为0,符合情况2。,所以。输出为0.0000000。 。
2. pfloat存储9.00 也就是说,科学计数法是:1.001×2^3。
1.第⼀位符号位。S=0。
2.有效数字。M等于001后⾯再加20个0。,凑满23位。
3.指数。E等于3+127=130, 即10000010。
因此,写成⼆进制形式,应该是S+E+M。,即。
0 10000010 001 0000 0000 0000 0000 0000。
这个32位的⼆进制数,作为整数进行分析c;是整数内存中的补码,原码正是 1091567616 。
分享让更多人看到
热门排行
- 1MySQL 日志系统:错误日志、慢查询日志、二进制日志
- 2安卓自动化Monkey测试教程:从基础到高级
- 3只看这篇文章就够了:0经验Windows部署DeepSekek Docker Dify实现个人/企业RAG知识库,安装和配置保姆级教程
- 4Springboot启动后常用的执行方法
- 5胖东起诉经济学家宋清辉索赔百万 后者说死敲到底:曾公开喊鼓励加班
- 6第一人称视角游戏哪些好玩? 人气第一人称视角游戏排名
- 7最新的秋叶启动器Stable2025 Diffusion V4.9版本更新教程来了,附下载链接
- 8Android Termux 安装Kali Linux 或 kali Nethunter史诗级详细教程
- 9企业级LLM:dify访问数据库(deepseek api mysql)
- 10科学游戏大全 十大经典科学游戏排名前十