まず、問題のアプリケーションは常に同じプロセッサ上にあり、コンパイラは常に gcc であるため、ビットフィールドが移植可能でないことは心配していません。
gcc は、最初にリストされたフィールドがバイトの最下位ビットに対応するようにビットフィールドをレイアウトします。したがって、a =0、b =1、c =1、d =1 の次の構造では、値e0のバイトが得られます。
struct Bits {
unsigned int a:5;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
(実はこれは C++ なので、g++ のことを言っています。)
ここで、 aを 6 ビット整数にしたいとします。
これで、なぜこれが機能しないのかがわかりますが、次の構造をコーディングしました。
struct Bits2 {
unsigned int a:6;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
b、c、およびdを 1 に設定し、 aを 0 に設定すると、次の 2 バイトになります。
c0 01
これは私が欲しかったものではありません。私はこれを見たいと思っていました:
e0 00
最初のバイトの最上位ビットに 3 ビット、最初のバイトの最下位 5 ビットと 2 番目の最上位ビットにまたがる 6 ビットを持つ構造を指定する方法はありますか?
これらのビットがどこに配置されるかは、私には制御できないことに注意してください。これは、他の誰かのインターフェイスによって定義されたビットのレイアウトです。