任何数据在内存中都是以二进制的形式存储的。浮点数也不例外。浮点的存储方式与整数有一点区别就是:浮点的存储方式是采用:符号位+阶码+尾数的形式。
符号位:在计算机内存中,通常都是以一位表示正数(用0表示)或者负数(用1表示)
阶码:在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置。它与科学计数法中的幂是一个道理。
尾数:指小数点后面的数
例:
将133.5f化为二进制数。首先将整数部分化为二进制数为
1000 0101
然后将小数部分化为二进制为0.1。则133.5的二进制数为
1000 0101.1
而在计算机中是怎么样存储这个数的呢?首先将这个二进制数用“科学计数法”的形式表示出来就是
1.0000 1011 * 2^7
这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码位数为8位(对于双精度来说,其规定的偏置量为1023。阶码位数为11位。),也就是说这里的阶码应该为127+7 = 134。将其化为二进制数为
1000 0110
由于规定小数点前面都为1,因此在计算机中,将不会存储小数点前面的1。这里的尾数就为00001011。其后全部补0,将其补充到23位。这里是正数,所以符号位为0。
在存储时,符号位在最前面,其次是阶码,最后放尾数。因此数字在内存中存储为:
0100 0011 0000 0101 1000 0000 0000 0000
其十六进制表示为:
0x43058000
以下为测试代码:
#include <stdio.h> int main() { float num = 133.5f; int *p = (int *)# printf("0x%x ", *p); return 0; }
上机运行可得到输出结果为: 0x43058000