簡體   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