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

时间:2009-02-25 19:01:15

标签: c bit-fields unions

我正在使用位域来轻松访问浮点库,我试图为没有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位然后是最后一位。除非我完全误解了bitfields的使用。我认为使用打包可以解决问题但是你可以看到它没有。

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

3 个答案:

答案 0 :(得分:17)

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

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。

答案 1 :(得分:0)

问题在于它是一个联盟。它应该是'struct'。

答案 2 :(得分:0)

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