繁体   English   中英

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

[英]What's the correct way of using bitfields in C?

我正在使用位域来轻松访问我正在尝试为没有 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 位,然后是最后一位。 除非我完全误解了位域的使用。 我认为使用打包可以解决问题,但正如您所见,它没有。

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

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

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

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

问题是它是一个工会。 它应该是“结构”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM