next up previous contents
Next: Union Up: 結構與聯合 Previous: 函式傳入結構指標   Contents   DYWANG_HOME

Bit Fileds

  1. Bit Fields:可以在 structure 中定義指定位元數的成員,宣告語法:
    struct {
      type [member_name] : width ;
    };
    
  2. 使用 bit-field 會有以下限制:
    1. cannot take address of bit-field:例如 fscanf, printf 時無法指定位址。
    2. 不能宣告成指標。
    3. 不能使用 sizeof 取得佔用位元組數。

  3. 範例:成員 age 使用 3 個位元,只能儲存 0 至 7 的數字。
    struct {
      unsigned int age : 3;
    } Age;
    
  4. 使用範例:當 age=8 超過 3 個位元,輸出為?
    [dywang@dyw219 zzz]$ vim struct4.c
    [dywang@dyw219 zzz]$ cat struct4.c
    #include <stdio.h>
    #include <string.h>
    
    struct {
    	unsigned int age : 3;
    } Age;
    
    int main () {
    	Age.age = 4;
    	printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
    	printf( "Age.age : %d\n", Age.age );
    
    	Age.age = 7;
    	printf( "Age.age : %d\n", Age.age );
    
    	Age.age = 8;
    	printf( "Age.age : %d\n", Age.age );
    
    	return 0;
    }
    
  5. 編譯錯誤:Age.age=8 使用 4 個位元。
    [dywang@dyw219 zzz]$ gcc -o struct4 struct4.c 
    struct4.c: In function ‘main’:
    struct4.c:16:2: warning: large integer implicitly truncated to unsigned type [-Woverflow]
      Age.age = 8;
      ^
    
  6. 將 main 函式的最後兩行刪除再編譯
    [dywang@dyw219 zzz]$ gcc -o struct4 struct4.c
    
  7. 執行結果:struct Age 宣告 int,一樣佔用 4 個位元組 (32 個位元),只是只用 3 個位元儲存 age。
    [dywang@dyw219 zzz]$ ./struct4 
    Sizeof( Age ) : 4
    Age.age : 4
    Age.age : 7
    



De-Yu Wang 2021-01-11