当前位置:天才代写 > tutorial > C语言/C++ 教程 > 学点C语言(27):数据范例 – 布局中的“位字段”

学点C语言(27):数据范例 – 布局中的“位字段”

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:409

副标题#e#

所有基本的数据范例, 最大的也不外 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;

下面的例子用措施对上面的说明做了落实:


#p#副标题#e#

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语言 – 目次”

 

    关键字:

天才代写-代写联系方式