#はじめに
C / C++ では Java などの他の言語では使えない「共用体」と「ビットフィールド」という機能があります。これらは、システム記述言語として C らしい機能です。
#共用体とは
まず、共用体ですが構造体に似ていますが、構造体と異なり1つのメモリ領域を使います。したがって、あるフィールドが変更されると、他のフィールドが影響を受ける場合があります。
共用体の使い道ですが、あるワードの上位バイトと下位バイトを入れ替えるとか、いくつかのバイトからなるデータを1回でクリアしたいとかなどが考えられます。
##共用体のサンプル
union.c
#include
void main() {
union LongWord {
long int lw;
int iw[2];
short sw[4];
unsigned char b[8];
};
union LongWord ld;
ld.lw = 0;
ld.sw[3] = 0xffff;
printf("%lx\n", ld.lw);
ld.b[7] = 0x80;
printf("%lx\n", ld.lw);
ld.b[0] = 0x01;
printf("%lx\n", ld.lw);
puts("Done.");
}
実行例
ffff000000000000 80ff000000000000 80ff000000000001 Done.
#ビットフィールド
ビットフィールドはあるワードをビット長を指定したフィールドに分けて使用できるという優れものです。
使い道ですが、あるワードで複数のフラグを管理するとかに使用できます。
##ビットフィールドのサンプル
bitfield.c
#include
void main() {
struct BF {
unsigned int a : 10;
unsigned int b : 8;
unsigned int c : 12;
unsigned int d : 2;
};
union {
struct BF f;
unsigned int u;
} d;
d.u = 0;
printf("%08x\n", d.u);
d.f.a = 0x3ff;
printf("%08x\n", d.u);
d.f.b = 0xff;
printf("%08x\n", d.u);
d.f.c = 0xfff;
printf("%08x\n", d.u);
d.f.d = 0x3;
printf("%08x\n", d.u);
}
実行例
00000000 000003ff 0003ffff 3fffffff ffffffff