C 是否允许在位文件中使用short或任何其他类型来代替int

C 是否允许在位文件中使用short或任何其他类型来代替int,c,bit-fields,C,Bit Fields,在大多数示例中,我都看到了位字段 使用无符号整数 为什么我们不能使用unsigned short或其他数据类型呢?来自: 位字段只能有四种类型中的一种,可能是const或volatile限定类型: unsigned int,对于无符号位字段unsigned int b:3;范围为0..7 有符号整数,对于有符号位字段,有符号整数b:3;范围为-4..3 int,对于具有实现定义的有符号性的位字段,请注意,这不同于其他任何地方的关键字int的含义,其中它表示有符号的int。例如,int b:3;可

在大多数示例中,我都看到了位字段 使用无符号整数

为什么我们不能使用unsigned short或其他数据类型呢?

来自:

位字段只能有四种类型中的一种,可能是const或volatile限定类型:

unsigned int,对于无符号位字段unsigned int b:3;范围为0..7 有符号整数,对于有符号位字段,有符号整数b:3;范围为-4..3 int,对于具有实现定义的有符号性的位字段,请注意,这不同于其他任何地方的关键字int的含义,其中它表示有符号的int。例如,int b:3;可能具有值0..7或-4..3的范围。 _Bool,对于单位字段Bool x:1;范围为0..1,与之之间的隐式转换遵循布尔转换规则。 可以接受其他实现定义的类型

用类似的术语来考虑这一点,有助于理解位字段外部的无符号字符、有符号字符和字符,后者的有符号性由实现定义。

第6.7.2.1p5节规定了位字段允许的类型:

位字段的类型应为合格或不合格 _Bool、有符号整数、无符号整数或其他类型的版本 实现定义的类型。它是由实现定义的 允许使用原子类型

因此,标准一致性编译器可能支持将unsigned short作为位字段的类型,但不一定要支持。因此,如果实现允许,您可以使用unsigned short作为位字段

例如,是否支持它:

4.9结构、并集、枚举和位字段

允许的位字段类型,但不包括_Bool、有符号整型和无符号整型 int C99和C11 6.7.2.1

其他整数类型,如long int和枚举类型 即使在严格一致的模式下也允许

还有:

语法

评论

可选声明器是访问成员的名称 在节目中。它必须是包含枚举的整数类型 类型。常量表达式指定了数据的位数 成员在结构中占有一席之地。匿名位字段-即, 无标识符的位字段成员-可用于填充


除了int之外,使用整数类型的实现可以使用该大小来确定位字段和其他字段之间要使用多少填充。

谁说不能呢?一旦您准确指定了位的数量,将其称为长或短就有点奇怪了。有默认的int,然后是短int和长int,然后是完全不同的,有精确大小的int的位字段,但同时应用这两种偏离是没有意义的。记住,位字段很奇怪,不仅仅是因为他们行为的大多数方面都是由实现定义的。一个特别的问题是,使用纯int可能会创建一个有符号或无符号位字段,这是实现定义行为的许多方面之一。请注意,实现必须指定它所做的事情,但它也可以这样做。在其他任何地方,int等同于signed int。bitfield是实现的定义,定义为i=i++,是未定义行为的定义。@Stargateur:您介意编辑/重新表述该注释吗,因为我不知道你想说什么?@DevSolar我想他是想说比特域细节是实现定义行为的典型例子。它们不仅仅是实现定义行为的随机示例,他认为,当人们想到实现定义行为时,首先想到的是它们。。。标准胜过cppreference.cpp。FWIW,我在那边的讨论页上提出了这个问题。@DevSolar我认为带符号的int与int是等价的。另一方面,字符是有符号的还是无符号的都是由实现定义的。@DevSolar:cppreference对int在位域上下文中定义有符号的实现没有错。参考文献6.7.2§5:每个逗号分隔的多集指定相同的类型,但对于位字段,是由实现定义说明符int在位字段中指定与有符号int相同的类型还是与无符号int相同的类型,我相信带符号的int不一定等同于int——尽管这种等价性在其他地方都适用。
struct example
{
    unsigned int number: 1
}
declarator  : constant-expression