2009-02-25 16 views
7

ビットフィールドを使用して、浮動小数点ライブラリに簡単にアクセスできます。浮動小数点ライブラリを持たないマイクロコントローラを作成しようとしています。Cでビットフィールドを使用する正しい方法は何ですか?

問題は、私がビットフィールドで動作させるように見えないことです。見てみましょう:

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ビット、そして最後のビットです。私がビットフィールドの使用を完全に誤解していない限り。私はを使用してをパックすると問題を解決すると思ったが、見たことがない。

本当にありがとうございます。私はこのサイトに何度もグーグル・グーグルでリードしているので、私は高い期待を持っています。

+1

ビットフィールドを使用する正しい方法は、ビットフィールドを使用しないことです。 –

答えて

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のエンディアンによって異なります。

+0

あなたの入力をありがとうが、なぜ構造体を組み込みの中に追加するのですか?浮動小数点数の部分の和集合を浮動小数点数にして、各ビットフィールドが浮動小数点数の適切な部分に対応することを確認しました。十分ではありませんか? –

+1

は、すべてのメンバが同じメモリを共有するようにします。私はビットフィールドを使用するとこの動作が変わるとは思わないので、すべてのビットフィールドはビット0から始まります。それらを構造体に入れると、順番にレイアウトされます。 – rmeador

+0

あなたは絶対に正しいです!それが必要だったのです。私は組合の私の理解を非難し:)。ありがとうございました。今、フロートの任意の部分に自由にアクセスできます。 –

0

問題は、それが組合であることです。それは '構造体'でなければなりません。

0

glibcプラットフォームを使用している場合は、ieee754.hヘッダーファイルを参照してください。それはendianessものに注意を払う。そうでない場合は、それを見てみる価値はまだあります。

関連する問題