连江网站建设服务,一元购物app,旅游响应式网站建设,网站开发php岗位职责目录
1. 浮点数存储规则
2. IEEE754规定#xff1a;
3. 关于M的说明#xff1a;
4. 关于E的说明#xff1a;
5. 关于S的说明#xff1a;
6.浮点数从内存中取出#xff08;三种情况#xff09; 情况1#xff1a;E不全为0或不全为1 情况2#xff1a;E全为0 情况3
3. 关于M的说明
4. 关于E的说明
5. 关于S的说明
6.浮点数从内存中取出三种情况 情况1E不全为0或不全为1 情况2E全为0 情况3E全为1 小心VS2022不可直接接触否则没这个必要方源面色淡然一把抓住顷刻炼化 1. 浮点数存储规则 大家都知道整型数据是以补码的方式存放在内存中。以下几个概念是需要知道的 原码补码反码都是以二进制形式表示的。 正整数的原码反码补码都相同。 负整数的补码反码1原码的符号位不变数值位按位取反。 但是浮点数不同浮点数有着一套自己的存储规则。 根据国际标准IEEE电气和电子工程协会 754任意一个二进制浮点数V可以表示成下面的形式 根据国际标准IEEE电气和电子工程协会 754任意一个二进制浮点数V可以表示成下面的形式 (-1)^S * M * 2^E(-1)^S表示符号位当S0V为正数当S1V为负数。M表示有效数字大于等于1小于2。2^E表示指数位。E是一个无符号整数。 这里需要记住S,M,E分别代表的是什么
简述S用于判断正负号M表示有效数字E与小数点相关 2. IEEE754规定 对于32位的浮点数最高一位为S接着的8位是指数E剩下的23位为有效数字M。 对于64位双精度数最高一位为S接着的11位是指数E剩下的52位为有效数字M。 3. 关于M的说明 无论是单精度float还是双精度double它们的有效数字M可以写成1.xxxx的形式但通常1都会省略掉系统默认为1这样可以节省一格bit位比如存放二进制1.01时M中只会存放01整数部位1会省略不写 4. 关于E的说明 E为一个无符号整数(unsigned int),因此如果E为8位bit它的取值为0-255如果E为11位bit它的取值为0-2047 IEEE 754规定存入内存时E的真实值必须再加上一个中间数这个中间数在8位的E中是127在11位的E中是1023(其实就是最大取值的一半)比如2的10次方的EE此时为10所以保存成32位float浮点数时必须保存成10127 137的二进制即10001001 5. 关于S的说明 S可以决定小数是正数还是负数如果存储的是正数S为0如果存储的是负数S为1 我们举出两个例子来讲解浮点数在内存中的存储
#define _CRT_SECURE_NO_WARNINGS
#includestdio.h
int main()
{float a 5.5f;/*S 0 5.5 的二进制为 101.1 整数部位1省略不写M 011因为101.1 1.011 * 10的2次方所以E 2因为是float型存储所以E要在真实值上加127即129,129的无符号二进制为1000 0001所以E的存储方式为1000 0001[0] [1][0][0][0][0][0][0][1] [0][1][1][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]S E M */float b 0.5f;/*S 0;0.5 的二进制为 0.1因为二进制形式规定第一位必须为1所以可以写成1.0 * 10的-1次方,因此 E -1,M 0E需要在真实值上127即126,126的无符号二进制为0111 1110,所以E的存储方式为 0111 1110低地址[0] [0][1][1][1][1][1][1][0] [0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]高地址*/
} 6.浮点数从内存中取出三种情况 我们学习了浮点数的存储那浮点数从内存中取出打印出来又是如何操作的呢 就像我们知道整数存储的是补码使用printf打印出来的是原码 情况1E不全为0或不全为1 当E不全为0或不全为1时浮点数在从内存中取出时会将E的计算值减去127或1023得到真实值再将有效数字M前加上第一位的1 详细讲解如下
#define _CRT_SECURE_NO_WARNINGS
#includestdio.h
int main()
{float a 5.5f;/*低地址[0] [1][0][0][0][0][0][0][1] [0][1][1][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]高地址S E M 取出方式E此时为小端存储无符号整数E表示129,取出时用129-127 得到E的真实值 2 再将有效数字M前加上第一位的1过程 1.011 向右移动 E 个小数点,得到最后结果101.1相当于二进制原码为101.1*/float b 0.5f;/*低地址[0] [0][1][1][1][1][1][1][0] [0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]高地址取出方式E此时无符号整数表示为126需要减去127得到E的真实值-1再将有效数字M前加上第一位的1,过程 1.0 向右移动 E 个小数点表示0.1相当于二进制原码为0.1*/
} 情况2E全为0 如果E全为0E等于1-127或者1-1023即为真实值有效数字M不再加上第一位的1而是还原成0.xxxxxxx的小数 #define _CRT_SECURE_NO_WARNINGS
#includestdio.h
int main()
{/*低地址[0] [0][0][0][0][0][0][0][0] [0][0][1][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]高地址S E M 如果浮点数此时这样存储想要推出它原本的二进制数E 1-127 得到真实值 -126M不再加1而是还原成0.xxxx,所以M此时为0.001相当于原码为 0.001的小数点向右移动-126位是一个极其接近0的小数*/
} 情况3E全为1 当E全为1时表示特殊值。如果M全为0表示±无穷大(正负取决于符号s如果M不全为0表示这不是一个数NaN。