• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C語言入門之枚舉與位運算(2)

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    C語言入門之枚舉與位運算(2): 位域 有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位
    C語言入門之枚舉與位運算(2):

      位域

       有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:

       struct 位域結構名

       { 位域列表 };

       其中位域列表的形式為: 類型說明符 位域名:位域長度

       例如:

    struct bs
    {
      int a:8;
      int b:2;
      int c:6;
    };

       位域變量的說明與結構變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如:

    struct bs
    {
      int a:8;
      int b:2;
      int c:6;
    }data;

       說明data為bs變量,共占兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點說明:

       1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所??臻g不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:

    struct bs
    {
      unsigned a:4
      unsigned :0 /*空域*/
      unsigned b:4 /*從下一單元開始存放*/
      unsigned c:4
    }

       在這個位域定義中,a占第一字節的4位,后4位填0表示不使用,b從第二字節開始,占用4位,c占用4位。

       2. 由于位域不允許跨兩個字節,因此位域的長度不能大于一個字節的長度,也就是說不能超過8位二進位。

       3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

    struct k
    {
      int a:1
      int :2 /*該2位不能使用*/
      int b:3
      int c:2
    };

       從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。

       二、位域的使用

       位域的使用和結構成員的使用相同,其一般形式為: 位域變量名·位域名 位域允許用各種格式輸出。

    main(){
      struct bs
      {
       unsigned a:1;
       unsigned b:3;
       unsigned c:4;
      } bit,*pbit;
      bit.a=1;
      bit.b=7;
      bit.c=15;
      printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
      pbit=&bit;
      pbit->a=0;
      pbit->b&=3;
      pbit->c|=1;
      printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
    }

       上例程序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變量bit和指向bs類型的指針變量pbit。這表示位域也是可以使用指針的。

       程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許范圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變量bit的地址送給指針變量pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當于: pbit->b=pbit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"|=", 相當于: pbit->c=pbit->c|1其結果為15。程序第17行用指針方式輸出了這三個域的值。

       類型定義符typedef

       C語言不僅提供了豐富的數據類型,而且還允許由用戶自己定義類型說明符,也就是說允許由用戶為數據類型取“別名”。 類型定義符typedef即可用來完成此功能。例如,有整型量a,b,其說明如下: int aa,b; 其中int是整型變量的類型說明符。int的完整寫法為integer,

       為了增加程序的可讀性,可把整型說明符用typedef定義為: typedef int INTEGER 這以后就可用INTEGER來代替int作整型變量的類型說明了。 例如: INTEGER a,b;它等效于: int a,b; 用typedef定義數組、指針、結構等類型將帶來很大的方便,不僅使程序書寫簡單而且使意義更為明確,因而增強了可讀性。例如:

    typedef char NAME[20]; 表示NAME是字符數組類型,數組長度為20。

       然后可用NAME 說明變量,如: NAME a1,a2,s1,s2;完全等效于: char a1[20],a2[20],s1[20],s2[20]
    又如:

    typedef struct stu{ char name[20];
      int age;
      char sex;
    } STU;

       定義STU表示stu的結構類型,然后可用STU來說明結構變量: STU body1,body2;

       typedef定義的一般形式為: typedef 原類型名 新類型名 其中原類型名中含有定義部分,新類型名一般用大寫表示, 以便于區別。在有時也可用宏定義來代替typedef的功能,但是宏定義是由預處理完成的,而typedef則是在編譯時完成的,后者更為靈活方便。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>