程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 學點C語言(27):數據類型 - 結構中的“位字段”

學點C語言(27):數據類型 - 結構中的“位字段”

編輯:關於C語言

所有基礎的數據類型, 最大的也不過 10 個字節;

我們可以自定義的數據類型 -- "結構", 通過把若干類型組合在一起, 讓一種類型可以大很多.

我們知道, 一個字節有八個 Bit 組成; 能否把一種類型縮小、縮小到 Bit 級?

結構中的 "位字段" 是以 Bit 為單位的, 這已經是計算機的最小單位, 大小是 char 類型的 1/8.

下面的例子中定義的位字段, 分別有 1-4 Bit 大小; 1 Bit 的字段只能放兩個數(0、1), 4 Bit 的字段也只能放下 16 個數:

1. 結構體可以包含位字段:

#include <stdio.h>

int main(void)
{
  struct Bit {
    unsigned a: 1; /* 1 Bit, 取值范圍: 0 - 1 */
    unsigned b: 2; /* 2 Bit, 取值范圍: 0 - 3 */
    unsigned c: 3; /* 3 Bit, 取值范圍: 0 - 7 */
    unsigned d: 4; /* 4 Bit, 取值范圍: 0 - 15 */
  } B;

  B.a = 1;
  B.b = 3;
  B.c = 7;
  B.d = 15;

  printf("%d, %d, %d, %d\n", B.a, B.b, B.c, B.d);

  getchar();
  return 0;
}

上例中, 位域的類型被指定為是無符號的整型(unsigned int), 我試著只要是整型都可以, 但要一致.

假如我們定義 8 個字段, 每個字段都是 1 Bit, 就可以很好地明細一個字節, 譬如:

11111111B = 255;

00000001B = 1;

00001111B = 15;

01111111B = 127;

下面的例子用程序對上面的說明做了落實:

2. 用 8 個 Bit 構成一個 unsigned char 數:

#include <stdio.h>

int main(void)
{
  struct Bit {
    int b8: 1;
    int b7: 1;
    int b6: 1;
    int b5: 1;
    int b4: 1;
    int b3: 1;
    int b2: 1;
    int b1: 1;
  } B;

  unsigned char *p = NULL;

  B.b1 = 1; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 255 */

  B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 0; B.b6 = 0; B.b7 = 0; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 1  */

  B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 15 */

  B.b1 = 0; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 127 */

  getchar();
  return 0;
}

3. 包含位字段的結構和其他結構沒有區別, 譬如同時包含其他類型的字段:

#include <stdio.h>

int main(void)
{
  struct Bit {
    unsigned b1: 1;
    unsigned b2: 1;
    float f;
  } B;

  B.b1 = 0;
  B.b2 = 1;
  B.f = 3.14;

  printf("%d, %d, %g\n", B.b1, B.b2, B.f);

  getchar();
  return 0;
}

返回“學點C語言 - 目錄”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved