简介
种类——-符号位S————-指数位E—————-尾数位M—-
float—第31位(占1bit)—第30-23位(占8bit)—-第22-0位(占23bit)
double–第63位(占1bit)—第62-52位(占11bit)—第51-0位(占52bit)
![](https://i-blog.csdnimg.cn/blog_migrate/b4cf615b2bae072cf1e97c07487d6df8.png)
浮点数在数轴上并不是连续的,只能是一个十分接近的近似值,但这个近似值已足够满足一般的应用了。
上述浮点数的表示只是一种通常的解释方式,实际使用中有会有部分改进,比如上述的浮点数没法表示真正的0。
目前使用最广泛的浮点数的表示方法是IEEE 754标准所定义的,该标准定义了32位单精度和64位双精度。
IEEE754标准定义了一些特殊值:
1.正零和负零,除去符号位,所有的数都为0的情况,认为是±0。这个0是一个精确值。
2.当指数是0111 1111=127时,减去偏移量127,即实际指数为0,尾数全零,默认的小数点前的数字是1,所以这种情况认为是±1.0
3.当指数域为0,尾数位非0时,认为是非规格化的数。规格化的数字,默认认为小数点前是1,而非规格化的数字,默认认为小数点前的数字是0。
并且,当数字是非规格化时,规定偏移量比原先大1,变成了-126。
4.指数域不为0,为规格化的数字,此时尾数域默认小数点前的数字是1,最小的规格化的数字的实际指数为1-127=-126,即最小的规格化数字为±2^-126
5.指数最大不能为255,255为保留值,只能是254,因此,实际指数值为254-127=127。最大的规格化的数字即1.11111111111111111111111(二进制)^127
6.指数域全1,尾数域全0,表示正负无穷。
7.指数域全1,尾数域不为0,是非法的浮点数。
用代码的形式解释浮点数在内存中到底怎样存储:
#include<stdio.h>
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;
}