C语言 读取float类型的二进制值
在计组的课程学习中,打算动手实现一下IEEE 754的浮点数计算。首先要做的就是从机器中获取浮点数的存储格式,然后再自行编写反向生成的函数来进行验证和学习。
其中获取二进制存储的思路是用&
(位与)运算符获取各位的二进制值。
然而,在编写完成的测试阶段遇到了这个问题: error: invalid operands to binary & (have 'float' and 'int')
代码是这么写的:
...
bits[a] = val & 1;
...
其中bits
为二进制码存储的数组,val
为需要解析的浮点数。
经过一番测试,发现&
运算符(其实不止,其它的位运算符也一样)的两侧似乎是只能放整形数据的。换句话说,根据个人理解,没有按照自然规则存储的浮点数是不允许进行位操作的。(真正的原因不一定是这个,还请有心人去阅读一下C/C++的官方手册,里面肯定有相关记载)但是,我的目的正是获得并理解这个“非自然的”存储规则。因而,经过在某度上的一番搜索,获得了一个解决思路:让编译器以为它是整形数据,并让它按照整形的规则进行读取。显然对数据进行类型转换是不行的,这样会直接改变它的存储方式。于是采取退而求其次的方法:指针。让编译后的代码按照整形的规则去读取浮点型的数据,其并不会检测内存中的数据类型,因而成功获得了目标数据。
代码更改如下:
...
int *float_bits = (int*)&val;
...
bits[a] = *float_bits & 1;
...
编译时未见报错,运行,成功获得期望数据。