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
[转]总述基金选择的步骤
16 年前
沒有留言:
張貼留言