C语言-位段
1、什么是位段
C語(yǔ)言允許在一個(gè)結(jié)構(gòu)體中以位為單位來(lái)指定其成員所占內(nèi)存長(zhǎng)度,這種以位為單位的成員稱(chēng)為位段。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。
2、位段在使用中需要注意的一些點(diǎn):
1、位段的內(nèi)存分配2)位段占的二進(jìn)制位數(shù)不能超過(guò)該基本類(lèi)型所能表示的最大位數(shù),即位段不能跨字節(jié)存儲(chǔ),比如在VC中int是占4個(gè)字節(jié),那么最多只能是32位; 1. 位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類(lèi)型。 2. 位段的空間上是按照需要以4個(gè)字節(jié)( int )或者1個(gè)字節(jié)( char )的方式來(lái)開(kāi)辟的。 3. 位段涉及很多不確定因素,位段是不跨平臺(tái)的,注重可移植的程序應(yīng)該避免使用位段。 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、位段占的二進(jìn)制位數(shù)不能超過(guò)該基本類(lèi)型所能表示的最大位數(shù),即位段不能跨字節(jié)存儲(chǔ),比如在char是占1個(gè)字節(jié),那么最多只能是8位;
?這里將_d設(shè)為9編譯器直接報(bào)錯(cuò)
3、在位段中不給其起名字,無(wú)法訪問(wèn)該位段,但是計(jì)算大小是仍占空間。
struct A {char _a : 2;char _b : 5;char _c : 8;char : 8; }s; int main() {printf("%d", sizeof(struct A));return 0; }輸出結(jié)果為:
4、不可對(duì)位段進(jìn)行取地址操作
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);這里對(duì)位段中的元素取地址操作system("pause");return 0; }?編譯時(shí)直接報(bào)錯(cuò):
?5、如果位段中存儲(chǔ)的數(shù)據(jù)大于位段自身大小就會(huì)發(fā)生截?cái)鄦?wèn)題(在vs2013中測(cè)試的結(jié)果),在輸出時(shí)會(huì)將截?cái)嘀蟮淖罡呶划?dāng)作符號(hào)位。例:
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; }如果將位段的類(lèi)型換為無(wú)符號(hào)的
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; }輸出結(jié)果為:
????????
我們接下來(lái)再用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; }輸出結(jié)果:
總結(jié)
- 上一篇: node2vec简单总结
- 下一篇: vdbench多主机运行指导