浮点数在内存中的存储方式

任何数据在内存中都是以二进制的形式存储的。浮点数也不例外。浮点的存储方式与整数有一点区别就是:浮点的存储方式是采用:符号位+阶码+尾数的形式。
符号位:在计算机内存中,一般都是以一位表示正数(用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 *)&num;
    printf("0x%x\n", *p);
    return 0;
}

 

上机运行可获得输出结果为: 0x43058000测试