泉州网站建设公司首选,wordpress主机内存,天猫优惠券网站怎么做,百度学术免费查重入口文章目录⚙️3.浮点型在内存中的存储#x1f529;3.1.一个例子#x1f529;3.2.浮点数的存储规则#x1f529;3.3.例题解析⚙️3.浮点型在内存中的存储
#x1f529;3.1.一个例子
#x1f534;浮点数存储的例子#xff1a;#x1f447;
int main()
{int n 9;float* …
文章目录⚙️3.浮点型在内存中的存储3.1.一个例子3.2.浮点数的存储规则3.3.例题解析⚙️3.浮点型在内存中的存储
3.1.一个例子
浮点数存储的例子
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;
}可以先猜想一下打印的4个值分别是多少 整型和浮点型在内存的存储是有区别的
3.2.浮点数的存储规则
根据国际标准IEEE电气和电子工程协会754任意一个二进制浮点数V可以表示成下面的形式 (-1)^S * M * 2^E (-1)^S 表示符号位当S0V为正数当S1V为负数 M 表示有效数字大于等于1小于2 2^E 表示指数位 我们举个栗子 假如一个10进制浮点数为5.5我们应该怎么转换成上面的形式呢 二进制的数据的每一位权重是这样分布的☝️ 根据规则转换完之后就是这样的☝️
IEEE 754规定 对于32位的浮点数float)最高的一位是符号位S接着的8位是指数E剩下的23位为有效数字M 对于64位的浮点数(double)最高的一位是符号位S接着的11位是指数E剩下的52位为有效数字M
IEEE 754对有效数字M和指数E还有一些特别规定
前面说过1M2也就是说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是可以出现负数的比如0.5 1.0 * 2^-1所以IEEE 754规定存入内存时E的真实值必须再加上一个中间数对于8位的E这个中间数是127对于11位的E这个中间数是1023。比如2 ^10的E是10所以保存成32位浮点数时必须保存成10127137即10001001 举个栗子5.5
int main()
{float f 5.5f;// 101.1// (-1)^0 * 1.011 * 2^2// 0 10000001 011 00000000000000000000// S E(2127) M 补20个0补齐23位// 40b00000 --- 16进制return 0;
}可以调试看一下内存 根据规则由此就可以知道了浮点数是如何存储的了
指数E从内存中取出还可以再分成三种情况
E不全为0或不全为1 这时浮点数就采用下面的规则表示即指数E的计算值减去127或1023得到真实值再将有效数字M前加上第一位1 比如 0.5(1/2)的二进制形式为0.1由于规定正数部分必须为1即将小数点右移1位则为1.0*2^-1其阶码为 -1127126表示为 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 3.3.例题解析
int main()
{int n 9;//00000000000000000000000000001001 -- 9的补码//0 00000000 00000000000000000001001//E 1-127 -126//M 0.00000000000000000001001//-1^0 * 0.00000000000000000001001 * 2^-126float* pFloat (float*)n;printf(n的值为%d\n, n);//9printf(*pFloat的值为%f\n, *pFloat);//0.0*pFloat 9.0;//以浮点数的视角存放浮点型的数字//1001.0//1.001 * 2^3//-1^0 * 1.001 * 2^3//S 0//E 3//M 1.001//0 (3127)10000010 00100000000000000000000 -- 补码原码printf(num的值为%d\n, n);//1091567616printf(*pFloat的值为%f\n, *pFloat);//9.0return 0;
}☝️double类型原理也是如此☝️ 希望大家可以理解 总结 以上就是 数据在内存中的存储下篇 内容啦 本文章所在【C语言知识篇】专栏感兴趣的烙铁可以订阅本专栏哦 希望我们可以做一个用心的人 小的会继续学习继续努力带来更好的作品 创作写文不易还多请各位大佬uu们多多支持哦