浮点型与整型在内存中存储时,规则是不一样的。
根据IEEE754标准,任意一个浮点型可以写做:
- (-1)^S*N*2^E
- (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
- M表示有效数字,大于等于1,小于2。
- 2^E表示指数位。
以5.5为例 (-1)^0*1.01*2^3 其中 S = 0 M = 1.01 E = 3。
通过这个式子可以将任意的浮点数转化为S,M,E这三个数值,通过存储这三个数值便可以实现将浮点型数据存储在内存当中。
浮点型的存储
在存储这三个数据时,会对M与E进行转化。
M转化:
因 1<=m<2;故所有的M可表示为 1xxxxxxxx的形式,因所有M都含有1,在存储时便对这位数据进行了省略,故所有M在数据中存储时,均为xxxxxxxx。
E转化:
因E有正数情况,也有负数情况。为方便存储,在存储时统一(32位情况下)加127 (64位情况下)加1023 后转化为二进制存储。
再次以5.5为例子
S = 0;
E = 1000 0010;
M = 01;
现在需三组数据存入内存
32位浮点数中,第一位为符号位,之后依次8位为指数位,后面的23位为有效数据M.
64位浮点数中,第一位为符号位,之后依次13位为指数位,后面的2位为有效数据M.
接着以5.5为例子(32位)
0100 0001 0010 0000 0000 0000 0000 0000
取出浮点型
取出浮点型时,大部分情况为存入的反向操作即可,不过存在两种特殊情况
E全为0时
E会被当作1-127(1-1023),此时2^E的大小无线趋近于0。
并且M位不在加上1。
举一个例子
int main()
{
int n = 5; // 00000000 00000000 00000000 000000101
printf("%f", n);
return 0;
}
当作浮点数取出时,E全为0,故大小应该为无穷小。
E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);