1. 程式人生 > >位段、位段計算大小、列舉、聯合

位段、位段計算大小、列舉、聯合

  1. 位段:成員必須是int 、unsigned int 和signed int .
    位段的成員名後邊有一個冒號和一個數字。
  2. 計算:位段是按位元位的大小來進行計算的,比如一個位元組有8個位元位,存入的時候根據資料型別的不同計算出相應的位元位依次往後儲存,若儲存不下則開闢下一個位元組
eg:
    struct s
    {
    int _a:4;
    int _b:5;
    int _b:6;
    int _b:30;
   };
   s就是一個位段型別
   printf("%d\n",sizeof(struct S));//8
   分析:int 型具有四個位元組,共32
個位元位,故儲存時將前三個放入第一塊空間中,由於第四個是30個位元位儲存不下,因此開闢下一快空間儲存,即開闢了兩快空間,就是好8個位元組。其他型別同理可得。

和結構相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平臺的問題存在。
跨平臺問題:
1)int 位段被當成有符號數還是無符號數是不確定的;
2)位段中最大的數目不能確定。(16位機器最大16,32位機器最大32)
3)當一個結構包含兩個位段,第二個位段成員比較大,無法容納第一個位段剩餘的位時,是捨棄剩餘的位還是利用,不確定。

列舉:一 一列舉

eg:
enum game
{
Start=2
; Play;//3 End//4 }; 列舉常量預設值從0開始,依次遞增一,在定義時也可賦初值。 enum game clr=play;//只能拿列舉常量給列舉變數賦值,才不會出現型別的差異。 clr=5; //ok?沒有實際的意義。

聯合(共用體)
是一種特殊的自定義型別,特徵是這些成員公用同一塊空間(所以聯合也叫共用體)。

union Un
    {
        char c;
        int i;

    };
    union Un A;
    printf("%d\n",sizeof( A));//4

面試題:判斷當前計算機的大小端儲存。

eg:
>union
Un { char c; int i; }; union Un A; A.i=0x11223344; A.c=0x55; printf("%x\n",A.i);//11223355 說明是小端儲存

*小端儲存是低位元組序存在低地址處,故44被55取代;
大端儲存是高位元組序存在低地址處,故11倍55取代。*

聯合體大小的計算:

“`
union Un
{
char c[5];
int i;

};

printf("%d\n",sizeof(union Un));//8

“`最大成員大小為5,最大對齊數為4,要對齊到最大對齊數的整數倍,故為8