3

有一个这样的结构声明:

typedef struct {
    int a:1;
    :0;
    int b:2;
} struct1;

我不明白如何阅读或理解它,我不明白以下内容:

1)struct1是一种数据类型,包含a两个字节的整数和 b,每个字节分别只有 1 位和 2 位可访问,

2) 是什么:0意思?

struct{ int a;int b;}struct1;3)和上面有什么区别typedef吗?

4)如果我创建一个像struct1 c={1,2,4};它这样的变量会给我错误“太多初始化程序”

4

2 回答 2

2

这些被称为位域。这是一种指定应该为结构中的每个变量分配多少位的方法。

  1. 它们不是“两个字节”,代码中没有任何说明。宽度为 1 的有符号整数也是一个非常糟糕的主意,它只能存储值 -1 和 0。
  2. 匿名位域:0导致后面的位域被分配到一个不同的int. 有关详细信息,请参阅此页面
  3. 是的,上面使用了位字段,这将影响访问ab完成的方式。
  4. 是的,结构中只有两个字段,a并且b. 不是三个。
于 2013-09-09T08:37:51.933 回答
0

struct1 中以这种方式声明的成员称为“位域”。顾名思义,这些成员在内存中只占用几个位长度。它们实际占用的位数和可以占用的位数分别取决于“:”后面的数字和 ABI。

所以,

struct bits_A {
    int a:10;
};

“a”是一个 10 位长度的成员。

尽管,

struct bits_B {
    int a:64;
};

x86_64-unknown-linux-gnu-gcc linux编译工具无法成功编译(错误“错误:'a'的宽度超出其类型”),因为在x86_64中,位域长度只能等于或更小超过 32。

“位域”是 c 编程语言中非常难的部分,因为位域实现与编译工具、ABI 和 Endian 不同。

所以,

  1. struct1 是一个包含两个成员的结构:1 位长度成员“a”和 2 位长度成员“b”。":0" 是一个长度为 0 的位字段,表示编译工具不会在同一个 int 中将 "a" 与 "b" 合并,因此它不是真正的成员。

  2. 根据1,长度为0的位域只是一个标志,指示编译工具不将“a”与“b”合并到同一个int中。更准确的解释是什么是零宽度位字段

  3. 在 struct{ int a;int b;}struct1; 中,“struct1”是一个变量。而关键字“typedef”只定义了一种新类型。

  4. struct1 中只有两个成员,请参见 No.2。

于 2013-09-09T14:00:51.860 回答