【问题标题】:What's the correct way of using bitfields in C?在 C 中使用位域的正确方法是什么?
【发布时间】:2009-02-25 19:01:14
【问题描述】:

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

问题是我似乎无法使其与位域一起使用。看看:

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 位,然后是最后一位。除非我完全误解了位域的使用。我认为使用 packed 可以解决问题,但如您所见,并没有。

任何帮助将不胜感激。我不止一次在谷歌上搜索时被引导到这个网站,所以我寄予厚望。

【问题讨论】:

  • 使用位域的正确方法是不使用位域。

标签: c bit-fields unions


【解决方案1】:

您的联合中可能缺少一个结构。

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

请注意,尾数/指数和符号的顺序取决于 CPU 的字节序。

【讨论】:

  • 感谢您的意见,但为什么要在联合中添加结构?我将浮点数的部分与浮点数合并,以确保每个位域对应于浮点数的适当部分。这还不够吗?
  • 联合会使其所有成员共享相同的内存。我不认为使用位域会改变这种行为,所以你所有的位域都从位 0 开始,就像“所有”浮点一样。将它们放在一个结构中可以按顺序排列。
  • 你完全正确!这就是所需要的。我责怪我对联合的理解:)。谢谢你的朋友,现在我可以随意访问我的浮动的任何部分了。
【解决方案2】:

问题在于它是一个联合体。它应该是“结构”。

【讨论】:

    【解决方案3】:

    如果您使用的是 glibc 平台,您可以查看 ieee754.h 头文件。它关心字节序的东西。如果不是,它仍然可能值得一看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2017-09-28
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      相关资源
      最近更新 更多