在C中使用位域的正确方法是什么?

我正在使用位域来轻松访问浮动库我试图为没有FPU的微控制器。

问题是我似乎无法使用bitfields。 看一看:

typedef struct { union{ unsigned long mantissa: 23; unsigned long exponent: 8; unsigned long sign: 1; float all; }; }_float __attribute__((__packed__)); 

问题是,当我尝试访问或更改任何内容时,它会将位域分别视为末端的1,8,23位。 虽然它应该是从末尾开始的23位,然后是8位然后是最后一位。 除非我完全误解了位域的使用。 我认为使用打包可以解决问题,但你可以看到它没有。

任何帮助将非常感激。 我一直在谷歌搜索这个网站不止一次,所以我寄予厚望。

你可能在工会中缺少一个结构。

 typedef struct { union{ struct { unsigned long mantissa: 23; unsigned long exponent: 8; unsigned long sign: 1; } float_parts; float all; }; }_float __attribute__((__packed__)); 

请注意,尾数/指数和符号的顺序取决于cpu的endianess。

问题是它是一个联盟。 它应该是’struct’。

如果您使用的是glibc平台,可以查看ieee754.h头文件。 它关注了endianess的东西。 如果没有,它仍然可能值得一看。