int与float在内存中的存储形式_对比与转换

来源:互联网 发布:java环境配置 编辑:程序博客网 时间:2024/05/29 16:55

看faac代码中看到int与float的联合体,看不懂代码,于是对这两种数据类型的存储方式做了一番了解

typedef union {
    float f;
    int i;
} fi_union;

//faac    aacquant.c   285行



int:

长度 4字节

以补码形式存数数据,首位为符号位,数据的二进制原码,经过反码(符号位不变),再加1得到数据的补码进行存储

还原时可减1,再对非符号位进行反码,记得到原码,转换为十进制即可


float:

长度 4字节

SEEE EEEE    EMMM MMMM    MMMM MMMM    MMMM MMMM     

     S: 表示浮点数正负,1为负数,0为正数
     E: 指数加上127后的值的二进制数(还原时将该数减127,得到指数的二进制)
     M: 底数,表示小数点后的二进制,隐含了个位上的1,即还原时,底数为1.MMMMM...
注意:这里有个特例,浮点数 为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。


如-12.5的float形式为

11000001    01001000    00000000    00000000

S:1,负数

E:1000001 0 == 130 减去127得3,即指数为3

M:100 1000 0000 0000 0000 0000 实际底数为1.1001

还原:符号 2^3 乘以 1.1001 即小数点右移3位 得到1100.1 即12.5(注意0.1表示2的-1次方,这里1在第-1位上)

加符号即得-12.5


为了验证int与float之间的转换,可以把-12.5的二进制按照int型翻译成十进制

符号位:1

补码:100 0001 0100 1000 0000 0000 0000 0000

减一:100 0001 0100 0111 1111 1111 1111 1111

反码:011 1110 1011 1000 0000 0000 0000 0000

十进制:1052246016

即-1052246016

利用union验证,分别按%d %f 输出


补充double型

double:

长度 8字节

存储模式与float相同,只不过不同字段的长度不同,见下表

符号位   阶码   尾数   长度 
float           1      8     23       32 
double       1     11    52       64 

其还原的计算方式完全相同。

double到float怎么转换?关键是阶码怎么截取?

0 0
原创粉丝点击