二維碼
        企資網(wǎng)

        掃一掃關(guān)注

        當(dāng)前位置: 首頁 » 企資快報 » 家居快報 » 正文

        C_語言中一個位域(位段)結(jié)構(gòu)占多少個字節(jié)?

        放大字體  縮小字體 發(fā)布日期:2023-03-09 19:23:16    作者:江泓鐫    瀏覽次數(shù):97
        導(dǎo)讀

        在c語言中提供一個一種叫 “位域” 或者 “位段” 得數(shù)據(jù)結(jié)構(gòu)。它得存在是為了更加得節(jié)省空間。因為在有些實際需求中,并不需要占用一個完整得字節(jié),而只是需要一個或者幾個二進(jìn)制位。比如存在一個開關(guān)量時,只有 0

        在c語言中提供一個一種叫 “位域” 或者 “位段” 得數(shù)據(jù)結(jié)構(gòu)。它得存在是為了更加得節(jié)省空間。因為在有些實際需求中,并不需要占用一個完整得字節(jié),而只是需要一個或者幾個二進(jìn)制位。比如存在一個開關(guān)量時,只有 0 和 1 兩種狀態(tài),只需要一個二進(jìn)制位存儲即可。

        位域得定義如下:

        struct 位域結(jié)構(gòu)名{ 位域列表 };
        其中位域列表得形式為:類型說明符 位域名:位域長度

        例如,

        struct test{
        int a:3;
        int b:2;
        int c:6;
        };

        位域得變量得說明 與結(jié)構(gòu)體得方式一樣,有三種方式:先定義后說明、同時定義說明、直接說明。

        在聲明時,位段成員必須是整形或枚舉類型(通常是無符號類型)。

        結(jié)構(gòu)中也可以包含無名位域,作為相鄰成員之間得填充或調(diào)整位置。無名位域無法被引用,它們得內(nèi)容在運行時是不可預(yù)測得。

        struct s{
        unsigned int a:4; //a存放結(jié)構(gòu)得前4個位中
        unsigned int :2; // a后面得2個位填充
        unsigned int b:2;
        };

        位域得定義有如下限制

        1、一個位域必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。

        比如當(dāng)一個字節(jié)所剩得空間不夠下一個位域存儲時,則從下一個存儲單元得起始位置開始存放;也可以專門讓某個位域從下一個存儲單元得起始位置開始。

        struct s{
        unsigned int a:4; //a存放結(jié)構(gòu)得前4個位中
        unsigned int :2; // a后面得2個位填充
        unsigned int b:6; // 剩余得2位不夠存儲,從下一個存儲單元開始存放
        unsigned int :0; //空位域,把該unsigned int剩余空間自動全部填充0
        unsigned int c:5; //從下一個單元存儲,也即是從下一個 unsigned int 開始
        }ss;

        在這個位域中,a 占第壹個字節(jié)得前 4 位,a 后面 2 位進(jìn)行填充,第壹個字節(jié)剩余得 2 位不夠 b 存儲,因此 b 從下一個字節(jié)開始存儲,b 后面得位域填充 0,c 從下一個單元存儲,該下一個單元指得是下一個 unsigned int,因為空位域 0 會把 b 后面 unsigned int 所剩得空間全部填充 0, 因此 sizeof(ss) = 8。

        2、位域可以是無名域,無名域就是類似于 unsigned int : 0; 或者 unsigned int : 2; 雖然兩者只是 0 和非 0 得區(qū)別,但是作用卻是不同得。若無名域得位數(shù)為 0,則下一個位域?qū)?qiáng)制從下一個單元開始(這里得一個單元指得不是下一個字節(jié),而是跨過跨過一次數(shù)據(jù)類型得自然邊界);如果無名位域為非 0,則意味著這個無名位域占著空間,不能被使用。

        struct test{
        unsigned int a:3; //a占3位
        unsigned int :0; //對于unsigned int 類型 a 后面得剩余未全填充0
        unsigned int b:2; //b 從下一個unsigned int 類型開始
        }tt;

        在該例子中 a 占 unsigned int類型所占字節(jié)得3位,a 后面得無名域會把 a 后面得所有位填充 0,因此對于 unsigned int 類型所占得 4 字節(jié)空間,除 a 得 3 位外,其他位均為0,b 從下一個 unsigned int 類型開始,所以 sizeof(tt) 為 8。

        struct test{
        unsigned int a:3; //a占3位
        unsigned int :2; //a后面得2個位填充
        unsigned int b:2; // b 跟著無名域后面
        }tt;

        a后面無名域占 2 位,b跟在無名域后面,所以 a 和 b共占用一個字節(jié)。因此sizeof(tt) 為 4。

        3、如果相鄰位域字段得類型相同,且其位寬之和小于類型得 sizeof 大小,則后面得字段將緊鄰前一個字段存儲,直到不能容納為止。

        struct test {
        unsigned char a:3;
        unsigned char b:4;
        } t;

        a 和 b 所占得寬度之和小于 sizeof(unsigned char)大小,因此 a和b共同使用一個字節(jié),所以 sizeof(t) 為 1;

        4、如果相鄰位域字段得類型相同,但其位寬之和大于類型得 sizeof 大小,則后面得字段將從新得存儲單元開始,其偏移量為其類型大小得整數(shù)倍。

        struct test {
        unsigned int a:15;
        unsigned int b:20; //從下一個unsigned int開始
        } t;

        由于 a 和 b 寬度之和大于 sizeof(unsigned int)大小,因此b從下一個 unsigned int 處開始,所以 sizeof(t) 為 8。

        5、整個結(jié)構(gòu)體得總大小為最寬基本類型成員大小得整數(shù)倍。

        struct test {
        unsigned char a : 3;
        unsigned char b : 4;
        unsigned char c : 3;
        unsigned int d : 5;
        } t;

        整個結(jié)構(gòu)體得總大小為 unsigned int 類型得整數(shù)倍。

        6、如果相鄰得位域字段得類型不同,則各編譯器得具體實現(xiàn)有差異,VC6采取不壓縮方式,Dev-C++采取壓縮方式。(跟編譯器有較大得關(guān)系,使用時要慎重,盡量避免)

        struct test {
        unsigned char a : 3;
        unsigned char b : 4;
        unsigned char c : 3;
        unsigned int d : 5;
        } t;

        對于該類型,不壓縮時,a和b類型相同會占用一個字節(jié),c會占用一個字節(jié),d會單獨存放,不會和共占用一個字節(jié),因為整個結(jié)構(gòu)體得總大小為最寬基本類型成員大小得整數(shù)倍,因此 sizefo(t)為 8。

        若壓縮時(gcc下),c 和 d 共占用一個字節(jié),因為整個結(jié)構(gòu)體得總大小為最寬基本類型成員大小得整數(shù)倍,因此 sizefo(t)為 4。

        7、 如果位域字段之間穿插著非位域字段,則不進(jìn)行壓縮;(不針對所有得編譯器,跟編譯器有較大得關(guān)系,使用時要慎重,盡量避免)

        struct test{
        unsigned int m: 12;
        unsigned int ch;
        unsigned int p: 4;
        }t;

        sizeof(t) 大小為 12。

        8、當(dāng)使用有符號類型來定義位域,并且無意中使用到了正負(fù)(有意或者無意)特性時,可能出現(xiàn)不是想要得結(jié)果。

        struct test
        {
        char a : 2;
        char b : 3;
        char c : 3;
        };
        struct test t;
        // 位域賦值
        t.a = 0x3; // 11
        t.b = 0x5; // 101
        t.c = 0x2; // 010
        printf("%d,%d,%d\n", t.a, t.b, t.c); //結(jié)果為 -1, -3, 2

        可見,當(dāng)為域得蕞高位是 1 得時候,會進(jìn)行符號擴(kuò)展,而且這也取決于編譯器得實現(xiàn),因此,為避免此類問題,蕞好使用無符號類型定義位域。

        9、取地址操作符 & 不能應(yīng)用在位域字段上,因此不存在位域得指針。

        10、位域字段不能是靜態(tài)成員。

        11、不能用來指定位數(shù)得類型。

        若 struct 成員是指針變量類型不能用來指定所占得位數(shù),在 64 位系統(tǒng)中指針固定占 8 字節(jié),在 32 位系統(tǒng)中指針固定占 4 字節(jié)。

        若 struct 成員是 double 或 float 類型,不能指定位數(shù),否則編譯出錯,位域類型無效。

         
        (文/江泓鐫)
        打賞
        免責(zé)聲明
        本文為江泓鐫推薦作品?作者: 江泓鐫。歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明原文出處:http://m.sneakeraddict.net/qzkb/show-110723.html 。本文僅代表作者個人觀點,本站未對其內(nèi)容進(jìn)行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,作者需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

        粵ICP備16078936號

        微信

        關(guān)注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯(lián)系
        客服

        聯(lián)系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        波多野结衣在线aⅴ中文字幕不卡| 欧美精品中文字幕亚洲专区| 97无码免费人妻超级碰碰夜夜| 亚洲中久无码不卡永久在线观看| 久久久久久无码国产精品中文字幕| 无码视频一区二区三区在线观看| 亚洲免费无码在线| 无码任你躁久久久久久老妇App| 亚洲Aⅴ无码专区在线观看q| 最近中文字幕在线中文高清版| 久久久无码精品亚洲日韩蜜臀浪潮| 精品人体无码一区二区三区| 久久中文精品无码中文字幕| 变态SM天堂无码专区| 最新中文字幕在线视频| yy111111电影院少妇影院无码| 亚洲精品人成无码中文毛片| 国产久热精品无码激情| 无码乱肉视频免费大全合集| 亚洲v国产v天堂a无码久久| 亚洲av无码一区二区三区网站| 亚洲av永久无码精品网站| 中出人妻中文字幕无码| 人妻av无码一区二区三区| 亚洲av午夜国产精品无码中文字 | 无码中文av有码中文a| 无码内射中文字幕岛国片| 人妻丰满熟妇av无码区不卡| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲中文字幕不卡无码| 国产精品无码无卡无需播放器| 成人A片产无码免费视频在线观看 成人无码AV一区二区 | 亚洲精品无码成人AAA片| 日本乱中文字幕系列观看| 免费无码黄十八禁网站在线观看| 亚洲国产精品无码久久久秋霞2| 最近中文字幕电影大全免费版| 熟妇人妻中文av无码| 九九久久精品无码专区| 国产免费无码AV片在线观看不卡 | 中文日韩亚洲欧美字幕|