今天看到一本書中有與下面這種結構體類似的使用形式:
typedef struct some_dev{
unsigned int var1 : 8;
unsigned int var2 : 13;
}
特意在VC++ 6.0中做了幾個測試:
測試1:
#include <stdio.h>
typedef struct test1{
unsigned int testint:8;
char *p :32;
int test2 : 16;
} test;
int main()
{
test obj;
obj.testint = 32;
obj.test2 = 256;
char *t="hello world!";
obj.p=t;
printf("\n\t%u.......%d.........%s", obj.testint, obj.test2 , obj.p);
return 0;
}
編譯結果:
struct_t.obj - 2 error(s), 0 warning(s)
error C2033: 'p' : bit field cannot have indirection
error C2034: 'p' : type of bit field too small for number of bits
即便指標p的長度為32或者64,編譯都不能通過。
所以我們可以這樣認為:
1:指標類型變數不能指定所佔的位元
測試2:
#include <stdio.h>
typedef struct test1{
unsigned int testint:8;
char *p;
int test2 : 16;
} test;
int main()
{
test obj;
obj.testint = 32;
obj.test2 = 256;
char *t="hello world!";
obj.p=t;
printf("\n\t%u.......%d.........%s\n", obj.testint, obj.test2 , obj.p);
return 0;
}
編譯連結均沒有錯誤警告資訊,運行結果為:
32.......256.........hello world!Press any key to continue
測試3:
#include <stdio.h>
typedef struct test1{
unsigned int testint:8;
char *p;
int test2 : 16;
} test;
int main()
{
test obj;
obj.testint = 256; //這裡修改obj.testint的值為256
obj.test2 = 256;
char *t="hello world!";
obj.p=t;
printf("\n\t%u.......%d.........%s\n", obj.testint, obj.test2 , obj.p);
return 0;
}
運行結果為:
0.......256.........hello world!
可以看到,成員變數obj.testint的運行結果已經變成“0”.
為什麼呢??
原來在結構體聲明的時候,我們給obj.testint的bit數聲明為8b的unsigned類型,它可以表示的最大值為(2^8 - 1),即255,我們在第三個測試中,給它賦值256,它的二進位值為:1 0000 0000 b,系統在保留時,只保留了後8位的值,對溢出的位,進行了截取拋棄處理,所以這裡輸出的結果為0.
而輸出sizeof(struct test)的結果為:12
也就是說這三個成員變數各佔4個位元組。
再測試幾組資料,結果也都能證明下面的結論:
2. 在聲明成員變數時,可以用
變數名 :bit數;
來確定結構體類型的成員變數的值所佔的字位元,如果在實際應用中,該變數的值超出了在聲明它時所聲明的字位元,那麼溢出的部分將會丟失。