站長資訊網
        最全最豐富的資訊網站

        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. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:

        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,%dn”,bit.a,bit.b,bit.c);
          pbit=&bit;
          pbit->a=0;
          pbit->b&=3;
          pbit->c|=1;
          printf(“%d,%d,%dn”,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則是在編譯時完成的,后者更為靈活方便。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久免费的精品国产V∧| 91精品国产综合久久婷婷| 动漫精品专区一区二区三区不卡| 久久精品国产精品亚洲| 国产亚洲精品一品区99热| 亚洲精品国精品久久99热一| 精品多毛少妇人妻AV免费久久| 精品国产_亚洲人成在线高清| 久久精品中文騷妇女内射| 亚洲午夜成人精品电影在线观看| 狠狠精品干练久久久无码中文字幕 | 久久久国产乱子伦精品作者| 免费人成在线观看欧美精品| 99精品久久久久久久婷婷| 精品999久久久久久中文字幕 | 中文字幕亚洲精品资源网| 国产精品久久久久jk制服| 亚洲综合精品网站| 日本欧美国产精品第一页久久 | 欧美午夜精品久久久久久浪潮| 91精品国产麻豆国产自产在线| 91精品在线看| 国产精品186在线观看在线播放| 久久夜色精品国产噜噜噜亚洲AV| 中文字幕精品久久| 亚洲精品A在线观看| 亚洲精品线路一在线观看| 精品无码人妻久久久久久| 国产区精品高清在线观看 | 欧美精品福利在线视频| 久久亚洲av无码精品浪潮| 精品国产综合区久久久久久| 国产亚洲精品线观看动态图| 国内精品久久久久久不卡影院| 国产精品va在线观看无码| 国产精品亚洲欧美大片在线看| 国产精品永久免费| 久久久亚洲精品蜜桃臀| 亚洲国产精品成人一区| 亚洲欧美日韩久久精品第一区| 中文字幕精品一区二区精品|