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
