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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言-位段

發布時間:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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; }

輸出結果:

總結

以上是生活随笔為你收集整理的C语言-位段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。