C++ ⇒ VBA 書いて覚えるための初心者自己中記事

C++ ⇒ VBA 勉強の履歴を付けるというかノート代わりに使ってます

C++ ビットフィールド 書いて覚えるための初心者自己中記事

通常の型は最小単位でも1バイト

 

構造体や共有体の宣言時、メンバ変数名の後ろに : をつけて数値を書くと

そのメンバ変数はビット単位になる。

struct Date {
	unsigned short year : 7;//7bit
	unsigned short month : 4;//4bit
	unsigned short day : 5;//5bit
};

この状態のメンバ変数はビットフィールドと呼ばれる。

ビットフィールドの型には整数型か列挙体型。

符号付き、無しは明示的に指定する必要あり。

実際の型より少なくはなるが、型の認識は変わらない。

型の認識は変わらないが、確保するメモリ領域が指定したビット分になる。

 

ビットフィールドのアドレスは取得できない。(アドレスはバイト単位だから)

参照にも渡せない。const参照へは渡せる、その場合はテンポラリオブジェクトが作られる。

 

メンバの一部でもOK

struct Date {
	unsigned short year;
	unsigned short month : 4;
	unsigned short day : 5;
	unsigned short weekday : 3;
};

 

共有体の一部にする。

int main() {
	union {
		unsigned int i;
		unsigned int b4 : 4;
	};
 
	i = 0x12345678;
	cout << b4 << endl;
 
	system("pause");
}

共有体の一部をビットフィールドにすると、上記の場合int i のどこかの4bit と共有される。

どこが共有されるかは処理系定義。

 

無名ビットフィールド

struct Date {
	unsigned short year;
	unsigned short month : 4;
	unsigned short  : 5;//無名ビットフィールド
	unsigned short weekday : 3;
};

メンバ変数名の無いビットフィールドを無名ビットフィールドという。

この場合、month と weekday の間に5bit のパディングが出来る。

さらに

struct Date {
	unsigned short year;
	unsigned short month : 4;
	unsigned short  : 0;//無名ビットフィールド サイズ0
	unsigned short weekday : 3;
};

メンバ変数が無名ビットフィールドでサイズが0bit

この状態だと、メモリの次のバイト境界までパディングを入れる機能がある。

 

型のサイズ以上のビットフィールド

struct Date {
	unsigned int year:44;//int型が4byte 32bit の環境
	unsigned short month : 4;
	unsigned short  : 0;
	unsigned short weekday : 3;
};

型のサイズ以上のビットフィールドを指定しても増えません。

あぶれた分がパディング状態になるだけ。

 

ここまで。