ビットフィールド

昼休みのログです。
一昨日出てきた ScmProcedureRec 構造体にビットフィールドが出てきたので確認してみた。
確認コードは以下。

#include <stdio.h>
#include <string.h>

int main(void)
{
	typedef struct testRec {
		unsigned int required : 16;
		unsigned int optional : 8;
		unsigned int type     : 3;
		unsigned int locked   : 1;
		unsigned int currying : 1;
/*		void *ptr;
 */
	} bitFieldTestRec;

	bitFieldTestRec x;
	unsigned int mask = 0xffffffff;

	memset(&x, '\0', sizeof(x));
	printf("sizeof(x) = %ld\n", sizeof(x));
	printf("sizeof(int) = %ld\n", sizeof(int));

	x.required = 65535;

	return 0;
}

で、gdb でナニ。x.required に 65535 を代入した直後で色々確認。x/t が手に残ってなくてびっくりしましたが help で何とか (ry

(gdb) p &x
$1 = (bitFieldTestRec *) 0xbfffede8
(gdb) x/t 0xbfffede8
0xbfffede8:     00000000000000001111111111111111
(gdb) set x.required = 0
(gdb) x/t 0xbfffede8
0xbfffede8:     00000000000000000000000000000000
(gdb) set x.optional = 0xff
(gdb) x/t 0xbfffede8
0xbfffede8:     00000000111111110000000000000000
(gdb) set x.optional = 0
(gdb) set x.type = 7
(gdb) x/t 0xbfffede8
0xbfffede8:     00000111000000000000000000000000
(gdb) set x.type = 0
(gdb) set x.locked = 1
(gdb) x/t 0xbfffede8
0xbfffede8:     00001000000000000000000000000000
(gdb) 

こーゆー順になるのな、と納得した昼下がり。