C语言-位段
1、什么是位段
C語言允許在一個結構體中以位為單位來指定其成員所占內存長度,這種以位為單位的成員稱為位段。利用位段能夠用較少的位數存儲數據。
2、位段在使用中需要注意的一些點:
1、位段的內存分配2)位段占的二進制位數不能超過該基本類型所能表示的最大位數,即位段不能跨字節存儲,比如在VC中int是占4個字節,那么最多只能是32位; 1. 位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類型。 2. 位段的空間上是按照需要以4個字節( int )或者1個字節( char )的方式來開辟的。 3. 位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應該避免使用位段。 struct S {char a:3;char b:4;char c:5;char d:4; }; struct S s = {0}; s.a = 10; s.b = 12; s.c = 3; s.d = 4;2、位段占的二進制位數不能超過該基本類型所能表示的最大位數,即位段不能跨字節存儲,比如在char是占1個字節,那么最多只能是8位;
?這里將_d設為9編譯器直接報錯
3、在位段中不給其起名字,無法訪問該位段,但是計算大小是仍占空間。
struct A {char _a : 2;char _b : 5;char _c : 8;char : 8; }s; int main() {printf("%d", sizeof(struct A));return 0; }輸出結果為:
4、不可對位段進行取地址操作
struct A {char _a : 2;char _b : 5;char _c : 8;char : 8; }s; int main() {printf("%d\n", sizeof(struct A));char *p = &(s._a);這里對位段中的元素取地址操作system("pause");return 0; }?編譯時直接報錯:
?5、如果位段中存儲的數據大于位段自身大小就會發生截斷問題(在vs2013中測試的結果),在輸出時會將截斷之后的最高位當作符號位。例:
struct A {char a : 2;char b : 5;char c : 8;char d: 8; }s; int main() {s.a = 7;//111s.b = 51;//1 10011//printf("%d\n", sizeof(struct A));printf("%d\n", s.a);printf("%d\n",s.b);return 0; }如果將位段的類型換為無符號的
struct A {unsigned char a : 2;unsigned char b : 5;char c : 8;char d: 8; }s; int main() {s.a = 7;//111s.b = 51;//1 10011//printf("%d\n", sizeof(struct A));printf("%d\n", s.a);printf("%d\n",s.b);return 0; }輸出結果為:
????????
我們接下來再用u%輸出試一下:
struct A {char a : 2;char b : 5;char c :8 ;char : 8; }s; int main() {s.a = 7;//111s.b = 51;//1 10011//printf("%d\n", sizeof(struct A));printf("a:%u\n", s.a);printf("b:%u\n",s.b);system("pause");return 0; }輸出結果:
總結
- 上一篇: node2vec简单总结
- 下一篇: vdbench多主机运行指导