看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是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。