位段、位段計算大小、列舉、聯合
阿新 • • 發佈:2019-01-30
- 位段:成員必須是int 、unsigned int 和signed int .
位段的成員名後邊有一個冒號和一個數字。 - 計算:位段是按位元位的大小來進行計算的,比如一個位元組有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