C語言位域使用及其注意事項

來源:互聯網
上載者:User

所謂“位域”是把一個位元組中的二進位劃分為幾個不同的地區,
並說明每個地區的位元。每個域有一個網域名稱,允許在程式中按網域名稱進行操作。
這樣就可以把幾個不同的對象用一個位元組的二進位位域來表示。位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:

struct 位域結構名

  {
位域列表 };

eg:struct weiyu {

                 
int a:2;

                 
int b:5;

                 
int   :5;//此五位為空白域,不能使用       

                 
int c:3;

                  
}

位域雖然簡單好用,但使用時需要注意:

1) 如果相鄰位域欄位的類型相同,且其位寬之和小於類型的sizeof大小,則後面的字

段將緊鄰前一個欄位儲存,直到不能容納為止;

2) 如果相鄰位域欄位的類型相同,但其位寬之和大於類型的sizeof大小,則後面的字

段將從新的儲存單元開始,其位移量為其類型大小的整數倍;

3) 整個結構體的總大小為最寬基本類型成員大小的整數倍。

4) 如果相鄰的位域欄位的類型不同,則各編譯器的具體實現有差異,VC6採取不壓縮方

式,Dev-C++採取壓縮方式;

5) 如果位域欄位之間穿插著非位域欄位,則不進行壓縮;(不針對所有的編譯器)

4 ,5跟編譯器有較大的關係,使用時要謹慎,盡量避免。

#include "stdio.h"

void main(int argn ,char *argv)

{

    struct    
test {

        unsigned a:10;

        unsigned b:10;

        unsigned c:6;

        unsigned :2;//this two bytes can't use

        unsigned d:4;

        }data,*pData;

    data.a=0x177;

    data.b=0x111;

    data.c=0x7;

    data.d=0x8;

   

    pData=&data;

    printf("data.a=%x data.b= %x data.c=%x data.d=%xn",pData->a,pData->b,pData->c,pData->d);//位域可以使用指標

    printf("sizeof(data)=%dn",sizeof(data));  
//4 bytes ,最常用的情況

    struct testLen{

    char a:5;

    char b:5;

    char c:5;

    char d:5;

    char e:5;

    }len;

   

    printf("sizeof(len)=%dn",sizeof(len));    
//5bytes 規則2

    struct testLen1{

        char a:5;

        char b:2;

        char d:3;

        char c:2;

        char e:7;

        }len1;

    printf("sizeof(len1) =%dn",sizeof(len1));   
//3bytes 規則1

    struct testLen2{

        char a:2;

        char :3;

        char b:7;

        long d:20; //4bytes

        char e:4;

        }len2;

    printf("sizeof(len2)=%dn",sizeof(len2)); 
//12 規則3,4,5,總長為4的整數倍,2+3
佔1byte,b佔1bye
由於與long對其,2+3+7
佔4位元組,後面 d
與 e進行了最佳化
佔一個4位元組

    struct testLen3{

        char a:2;

        char :3;

        char b:7;

        long d:30;

        char e:4;

        }len3;

    printf("sizeof(len3)=%dn",sizeof(len3));//12
規則3,4,5,總長為4的整數倍,2+3
佔1byte,b佔1bye
由於與long對其,2+3+7
佔4位元組,後面 d佔一個4位元組,為了保證與long對其e獨佔一個4位元組

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.