28

可能重复:
结构声明中的冒号是什么意思,例如:1、:7、:16 或:32?

这是参考页面的 C 代码示例。

      signed int _exponent:8;

'8'和'8'本身之前的冒号是什么意思?

4

4 回答 4

32

这是一个位域。它仅在struct定义中有效,这意味着系统将仅使用 8 位作为整数。

于 2010-10-21T02:55:52.190 回答
18

它是一个位域,是一种晦涩难懂且被误导的结构特征。这应该足以让您查找处理其他人代码中的位域所需的信息。至于你自己的代码,永远不要使用位域。

编辑:根据 Zack 的要求,与执行自己的位算术相比,位域有明显的缺点,而且没有优点。这里是其中的一些:

  • 您一次只能复制、比较、序列化或反序列化一个位域元素。做你自己的位算术,你可以一次对整个单词进行运算。
  • 您永远不能拥有指向位域元素的指针。使用您自己的位算术,您可以拥有一个指向较大字的指针和一个字内的位索引作为“指针”。
  • 只要您使用固定大小的类型并知道字节序,直接将 C 结构读/写到磁盘或网络是不带位域的中途可移植的。但是,即使在给定的 cpu 架构中,加入位域,以及较大类型中元素的顺序,以及使用的总空间和对齐方式,都变得高度依赖于实现。
  • C 规范有非常奇怪的规则,允许位域元素的符号与您期望的不同,而且很少有人知道这些。

对于单位标志,使用您自己的位算术而不是位域是完全不费吹灰之力的。对于需要打包的较大值,如果将所有位算术都写出来太痛苦,请编写一些简单的宏。

于 2010-10-21T02:58:36.827 回答
4

它是位域规范。

这意味着_exponent只需要一些8signed int,通常需要多于8位。通常,位域与无符号类型一起使用。

IIRC,如果将不适合 8 位的内容写入_exponent.

于 2010-10-21T02:59:22.033 回答
2

当该语句位于结构内时,表示位字段

于 2010-10-21T02:56:37.020 回答