安康 住房城乡建设部网站,网站制作推广电话,没有网站怎么推广,遵义网红景点目录 浮点数家族
浮点数类型在内存中的存储
一.为什么说整型和浮点数在内存中存储方式不同#xff08;证明#xff09;
二.浮点数的存储规则
浮点数在计算机内部的表示方法
1.对于M的存储和取出规则
2.对于E的存储和取出时的规则
对前面代码结果进行解释#xff1a; …目录 浮点数家族
浮点数类型在内存中的存储
一.为什么说整型和浮点数在内存中存储方式不同证明
二.浮点数的存储规则
浮点数在计算机内部的表示方法
1.对于M的存储和取出规则
2.对于E的存储和取出时的规则
对前面代码结果进行解释
代码
解释如图 浮点数家族
包括 floatdoublelong double
整型家族类型表示的范围可以在 “limits.h”里查看
浮点数家族表示的范围在 “float.h” 中定义可以在这里面查浮点数类型表示的精度最大最小值等...
以查看浮点数范围为例打开float.h文件
如 浮点数类型在内存中的存储
一.为什么说整型和浮点数在内存中存储方式不同证明
可以通过一个代码来解释整型和浮点数在内存中的存储方式是不同的
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.hint 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;
}
运行结果 运行结果分析如果整型类型和浮点数类型的存储的方式一样
预期结果应该是 9 9.00000 9 9.000000
所以通过这个结果可以看出整型和浮点型在内存中存储的方式有一定的差异 二.浮点数的存储规则
浮点数在计算机内部的表示方法
根据国际标准IEEE电气和电子工程协会 754任意一个二进制浮点数V可以表示成下面的形式 (-1)^S * M * 2^E (-1)^S 表示符号位当S0V为正数当S1V为负数。 M表示有效数字大于等于1小于2。 2^E表示指数位。
举例来说 十进制的5.0写成二进制是 101.0 相当于 1.01×2^2 。 那么按照上面V的格式可以得出S0M1.01E2
十进制的-5.0写成二进制是 -101.0 相当于 -1.01×2^2 。那么S1M1.01E2
并且IEEE 754规定
对于32位的浮点数最高的1位是符号位S接着的8位是指数E剩下的23位为有效数字M。 对于64位的浮点数最高的1位是符号位S接着的11位是指数E剩下的52位为有效数字M。 特别注意的是对M和E的存储还有特别之处
1.对于M的存储和取出规则
首先M的范围是1M2的数都可以写成1.xxxxxxx的形式每个M小数点前面都有1所以存出的时候只需要把小数点后面的xxxxxxx存储起来取出的时候再统一在小数点前面加上1这样的好处是以32位 浮点数为例留给M只有23位 将第一位的1舍去以后等于可以保存24位有效数字。
2.对于E的存储和取出时的规则
首先E为一个无符号整数unsigned int
因为无符号整数只能表示正数但是科学计数法中E是可以为负数所以IEEE 754规定E在存入内存中时加上一个中间值对于8位的E这个中间数 是127对于11位的E这个中间 数是1023。
比如2^10的E是10所以保存成32位浮点数时必须保存成10127137即 10001001又如2^-2的E是-2所以保存成32位浮点数时必须保存-2127125即01111101让E变为正数
指数E从内存中取出还可以再分成三种情况
1.不全为0和不全为1
E在存储时加了中间值 127 / 1023 所以E在取出时用减去 127 / 1023 得到真实值
0.51/2的二进制形式为0.1由于规定正数部分必须为1即将小数点右移1位则为 1.0*2^(-1)其阶码为-1127126表示为 01111110而尾数1.0去掉整数部分为0补齐0到23位00000000000000000000000则其二进 制表示形式为:0 01111110 00000000000000000000000
2.E全为0时
浮点数的指数E等于1-127或者1-1023即为真实值 有效数字M不再加上第一位的1而是还原为0.xxxxxx的小数。这样做是为了表示±0以及接近于 0的很小的数字即为什么下图结果为0.00000 3.E全为1
即2^E,例E为8位时11111111转换为十进制为255即2^255是个很大的数了更不用说11位的E了所以如果有效数字M全为0表示±无穷大正负取决于符号位s 对前面代码结果进行解释
代码
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;
}
解释如图