日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言-位段

發(fā)布時(shí)間:2023/12/31 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言-位段 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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é)

以上是生活随笔為你收集整理的C语言-位段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。