程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C言語位域的運用與留意事項

詳解C言語位域的運用與留意事項

編輯:關於C++

詳解C言語位域的運用與留意事項。本站提示廣大學習愛好者:(詳解C言語位域的運用與留意事項)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C言語位域的運用與留意事項正文


位域的定義

有些信息在存儲時,並不需求占用一個完好的字節, 而只需占幾個或一個二進制位。例如在寄存一個開關量時,只要0和1 兩種形態, 用一位二進位即可。為了節省存儲空間,並使處置簡便,C言語又提供了一種數據構造,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域,並闡明每個區域的位數。每個域有一個域名,允許在順序中按域名停止操作。 這樣就可以把幾 個不同的對象用一個字節的二進制位域來表示。

位域的定義和位域變量的闡明位域定義與構造定義相仿,其方式為:

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字節
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家學習或許運用C言語能帶來一定的協助,假如有疑問大家可以留言交流。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved