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定義が出来ることに感動したので、これの検証をする。
以下のプログラムを試してみる。
includestruct 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変数でやってみるとだめだった。)