bit field

  • Bit Fieldを共用体メンバと利用する実験をしてみた。
#include <stdio.h>

typedef unsigned short __u16;

typedef struct{
  __u16 d0:8, d1:4, d2:2, d3:1, d4:1;
} bits_t;

typedef union{
  bits_t bits;
  __u16 all;
} bf_t;

typedef union{
  __u16 d0:8, d1:4, d2:2, d3:1, d4:1;
  __u16 all;
} bf_t2;

typedef union{
  __u16 d0:8, d1:4;
  __u16 d2:2, d3:1, d4:1;
  __u16 all;
} bf_t3;


main (){
  bf_t bf;
  bf_t2 bf2;
  bf_t3 bf3;

  bf.bits.d0=1;
  bf.bits.d1=2;
  bf.bits.d2=3;
  bf.bits.d3=1;
  
  printf("bf.all=%x\n", bf.all);

  bf2.d0=1;
  bf2.d1=2;
  bf2.d2=3;
  bf2.d3=1;
  printf("bf2.all=%x\n", bf2.all);

  bf3.d0=1;
  bf3.d1=2;
  bf3.d2=3;
  bf3.d3=1;
  printf("bf3.all=%x\n", bf3.all);


}
  • 結果

bf.all=7201
bf2.all=8503
bf3.all=3


bfのみが期待通りの結果。
やはり、共用体として利用するには、bit field部分だけ別の構造体に
しないとうまくいかないようだ。

bf3は、行毎にメンバが作られたように見えるが、
bf2は、どういう動きでこのような結果になるのかは不明。

uname -a
Linux dell2 2.6.11-1.1369_FC4 #1 Thu Jun 2 22:55:56 EDT 2005 i686 i686 i386 GNU/Linux