三.浮点型在内存中的存储
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;
}
上面是两种类型的代码
一是整形输入,打印整形和浮点型。儿是浮点型输入,打印整形和浮点型。
结果是什么呢?
我们发现,整形输入整形打印,浮点型输入浮点型输出,都可以打印出对应的结果。但是输入输出类型不同,却得到了奇怪的结果。
由此可知:整形和浮点型在内存中的存储方式不同
2.浮点型存储
下面来介绍国际规定浮点型存储方式:
(-1)^S*M*2^E
举例说明:
a=5.0,请分析a如何存储
- 将十进制转化成二进制:101.0
- 将这个二进制小数点移动,到达1<=a<2的程度。放在这个例子里面是小数点向左移动2位。1.010 这一步得到两个数据:M=1.01,E=2
- 存储正负号:(-1)^0=1,也就是正数 这一步得到一个数据:S=1
S表示符号位,当S为0,是正数。当S为1,是负数
M表示有效数字,1<=M<2
E表示指数位,向前后移动的小数位
![62bcca25d4ec433ba0894922f471961b.png](https://i-blog.csdnimg.cn/blog_migrate/eb2db820ae21d1924e24e88a4bdbc735.png)
![f1904eae651c4eb58095f3795477a11a.png](https://i-blog.csdnimg.cn/blog_migrate/f05757f7ff5e36539d3430db3945cb92.png)
一些特殊规定
M:存储时不存小数前的1,读取时直接加上1(24——23 53——52,这样就节省了空间
- E:它是一个无符号数,没有负数。但是小数点左移右移应该包括正数负数。解决办法:存入内存中的数字要加一个中间值(127,1023)(eg:2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137)
3.浮点型读取
规则
关于E有特殊情况
- E不全为0或不全为1(正常E)
E-127(1023),M加上前面的1
- E全为0
(E=0,-127+127=0,真实值-127)
这时:E=1-127,M=0.xxxxxxxxx
趋于0
- E全为1
(E=128,128+127=225,+/-2^128是无穷数)
下面来重新看开头举的那个例子,看我们能否算出那些结果
整形存,浮点型取
9——0(S)00000000(E)00000000000000000001001(M)——S=0,E=-126,M=0.00000000000000000001001——(-1)^0 * 0.00000000000000000001001 * 2^(-126)——这是一个接近于0的数,所以显示0.0000000
从32比特位中取SEM,用算式算出浮点数
浮点型存,整形取
9.0——1001.0——(-1)^0 * 1.001 * 2^3——0(S=0)10000010(E=3+127+130)0010000000000000000000(M=1.001)——0100000100010000000000000000000——还原十进制1091567616
从数字里用算式算出SEM,存在32比特位算出整形
完