为什么位域必须是整数?

zub*_*rgu 3 c integer bit-fields

我搜索过的每一本书,互联网上的每个教程以及SO上的每一个问与答都说,位域必须是整数类型。这是为什么?

Jon*_*ler 5

让我们提出相反的问题:

  • 位字段可以是整数类型以外的其他类型吗?

让我们回顾一下这些选项:

  1. void:没有值-无法使用。
  2. 指针:但是机器上的指针是固定大小的;您不能使用13位的指针并期望它表示任何含义。
  3. 结构,联合:但是,您不必处理简单的字段。
  4. 留下了floatdouble,但是这些是经过精心设计的格式,您不能简单地使用double(或float)中的13位来期望它的含义。

所以,你已经通过了方案后,你留下了各种类型的整数:charshortintlonglong long(在符号和无符号的形式),和_Bool。这些选项中,该标准规定,您可以使用_Boolunsigned intsigned int和“平原” int

ISO / IEC 9899:2011§6.7.2.1 结构和联合类型说明符

¶5位字段应具有一种类型,是一个合格的或不合格的版本_Boolsigned intunsigned int,或一些其他实现定义类型。是否允许原子类型由实现定义。

'plain'的行为int是由实现定义的:它可以是签名的也可以是未签名的(大致类似于'plain' char可以是签名的也可以是未签名的)。因此,jxh的评论是正确的;我粗心地引用了太多的类型(但是我改写了一些东西,以免引起误解)。

请注意,大多数位字段的行为都是由实现定义的。除符号外,标准中所指定的内容很少。