32
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C 言語の共用体とビットフィールドの簡単なサンプル

Last updated at Posted at 2015-03-11

#はじめに

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

32
33
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?