float类型数据的存放问题
目前已知的所有的C/C++编译器都是按照IEEE制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的float的规格:
float
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
每8位分为一组,分成4组,分别是A组、B组、C组、D组。
每一组是一个字节,在内存中逆序存储,即:DCBA
我现在要办的就是知道FLOAT数为40.00,要求出对应ieee浮点数字符串表示(42200000)
自己做应该怎么来实现?或者有没有实现这个功能函数?
[解决办法]
float f = 40.0f;
char *p = (char *)f;
然后利用 p 逐字节操作 f
[解决办法]
这个问题的常规解决思路是用数字符串运算的思路,
(提示:先认真研究IEEE754: http://steve.hollasch.net/cgindex/coding/ieeefloat.html)
首先,将float型数分整数、小数据部分分别转成二进制数;
然后,将转化后的二进制数再转换成二进制字符串;
接下来,根据二进制移位运算的规则(右移一位表除2、左移一位表乘2),对该二进制串进行移位(如果float数小于1则左移),直至整数位只有唯一的1,同时记录下移位的次数(此即阶码左移阶码为负,右移为正);
之后,将所得的阶符、阶码、尾符、尾码等逐一对号拼接起来,得到的就是IEEE754标准的float型二进制字符串;
最后,将此二进制字符串化成十进制数字符串,并输出。
关键的算法:数转字符串,不同进制数字符串的互化,这些网上可以找些相关CODE看看,或有现成的算法。
其它可参考网站:http://babbage.cs.qc.edu/IEEE-754/32bit.html
[解决办法]
阶码的符号是由Bias来确定,32位的Bias为127。如果右移N位,则阶码为Bias-N,如果左移N位,则阶码为Bias+N。
这里的127也要用二进制数字串形式(1111111)进行运算。