3-2 共有体

共用体は、複数の変数や配列を同じ記憶域を使用するようにまとめたもの。各項目に同時にアクセスすることは出来ない
以下に説明するような用法がある。


3.3.1 記憶域の効率的な使用

同じ記憶域を複数の目的に使用し、メモリを節約するために共用体を使う。メモリの増大と共に使われる頻度は減っているが、非常に大量のオブジェクトが使用されるような場面では、現在でも用いられている。


3.3.2 多態の実装

最も多く見られる使用目的。
ひとつのオブジェクトだけを使って、様々な型を表現したいとき用いられる。構造体と組み合わせて使われることが多い。

// 構造体の識別番号
enum subject_type {
JAPANESE = 0;
MATH = 1;
ENGLISH = 2;
SCIENCE = 3;
CIVICS = 4;
}
struct subject_inf{
enum subject_type type; // 保持している科目の種類(型、type)を保持
union{
struct s_japanese japansese;
struct s_math math;
struct s_english english;
struct s_science science;
struct s_civics civics;
} sb;
}


様々な内部表現による操作

ある変数aの内部表現に直接アクセスしたいとき、その変数aと、その内部表現にアクセスするための変数を共用体で宣言する。以下はIEEE754形式で保存されているfloatの各要素に個別にアクセスするための共用体。

union float_int{
float a;
struct{
unsigned int mant : 23; // 仮数部
unsigned int exp : 8; // 指数部
unsigned int sign : 1; // 符号部
} s;
}

-練習問題

練習問題より、コロンでbit定義が出来ることに感動したので、これの検証をする。

以下のプログラムを試してみる。


include

struct hoge {
> int a : 1;
};

int main(void){
> struct hoge hoge1;
> hoge1.a = 0;
> printf("hoge = %x\n", hoge1.a);
> printf("hoge = %x\n", ++hoge1.a);
> printf("hoge = %x\n", ++hoge1.a);
}

結果
hoge = 0
hoge = 1
hoge = 0xffffffffe

struct hogeのaをintで(signedで)宣言すると、変な値になる。
unsignedで宣言するようなのかな?
そもそもなんでstruct内でないとコロンを使えないのだろう(local変数でやってみるとだめだった。)