ビットフィールド
昼休みのログです。
一昨日出てきた 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)
こーゆー順になるのな、と納得した昼下がり。