2011年8月29日 星期一

Bit-field of struct

Bit-field 是一種省空間的特殊 data member, 可以使用特定幾個 bit 來放 data.

#include <stdio.h>

struct Data_Detail
{
  unsigned short s1 : 1;
  unsigned short s2 : 3;
  unsigned short s3 : 4;
  unsigned short s4 : 8; // 剛好塞滿一個 16 bit 之 unsigned short
};

typedef struct _Data_View {
  char v1 : 1;
  char v2 : 1;
  char Reserve : 6; // 保留6 bit,當以後需要可以使用
} Data_View;

int
main (
  )
{

{
  Data_View X;
  X.v1 = 0;
  X.v2 = 1;
  printf ("X.v1 is %d\n", X.v1);
  printf ("X.v2 is %d\n", X.v2);
}

{
  struct Data_Detail Value;
  Value.s1 = 1;
  Value.s2 = 2;
  Value.s3 = 3;
  Value.s4 = 4;
  printf ("Value.s1 = %d\n", Value.s1);
  printf ("Value.s2 = %d\n", Value.s2);
  printf ("Value.s3 = %d\n", Value.s3);
  printf ("Value.s4 = %d\n", Value.s4);
}

  return 0;
}


建議同一個struct裡面的Bit-field是同一型別,避免因為不同型別而導致錯亂。

若不同的type放在同一個struct裡面,我猜想每一個同型別所需要的空間會算在一起。
例如:
char v1 : 1與char v2 : 1與char Reserve : 6所需要的空間一共是8bit,剛好就是一個char。
所以,用sizeof (Data_View)會是1 (byte)


若在Data_View的結構裡面,加入一個unsigned short s4 : 1
其中unsigned short 是 2 bytes
用sizeof (Data_View)的值會是4,我猜原因是char與unsigned short是分開算的,並且以其中一個最大的為單位,
因為最大是unsigned short是2 bytes,所以,一共是4bytes。

不過,我想這個結果可能跟不同的Compiler不同,而結果有所不同。

參考資料:
Union and Bit-field

沒有留言: