C/C++ 中float的内存结构

float的内存结构

一个32位的float数和一个64位double数的存储主要分为三部分:符号位,指数位,尾数位。

以float数为例:

    符号位(sign): 1个bit,0 代表正数,1 代表负数 指数位(exponent):8个bit, 范围-127~128,用于存储科学计数法中的指数部分,并且采用以为存储方式,所存储的数据为原数据+127 尾数位(mantissa): 23bit,用于存储尾数部分

float数的表示形式: p o w ( − 1 , s i g n ) ∗ ( 1 + m a g ) ∗ p o w ( 2 , e x p − 127 ) pow(-1,sign)*(1+mag)*pow(2,exp-127) pow(−1,sign)∗(1+mag)∗pow(2,exp−127)

float 存储示例

f1=18.25f=(10010.01)B=(1.001001*2^4) 则符号位S=0;指数位E=4, 在C++中是将指数位加上127来存储的,即E=E+127=4+127=131 则16进制表示为0x83; 尾数位(小数部分)M=(001001)B。

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

int main()  
{
          
     
    float f1,frac_mag,f2;  
    int temp,sign,exp,mag;  
   
    f1=18.25;  
    temp = *(int*)&f1;  
    sign = (temp>>31)&0x01;  
    exp = (temp>>23)&0xFF;  
    mag = temp&0x7FFFFF;  
    frac_mag = 1.0f*mag/0x800000;  
    f2 = (sign==0?1:-1)*(1+frac_mag)*pow(2,exp-127);  
    printf("temp=0x%X
",temp); 
    printf("float:f1=%f
",f1);  
    printf("sign=0x%X,exp=0x%X,mag=0x%X
",sign,exp,mag);  
    printf("float:f2=%f
",f2);  
    return 0;  
}

运行结果: 则18.25f在内存中的比特表示为0x41920000: 0100 0001 1001 0010 0000 0000 0000 0000

float与double的表示范围

经验分享 程序员 微信小程序 职场和发展