我搜索过的所有书籍、互联网上的所有教程和SO上的所有问答都说,位域必须是整数类型。为什么呢?
我搜索过的所有书籍、互联网上的所有教程和SO上的所有问答都说,位域必须是整数类型。为什么呢?
char
、short
、int
、long
、long long
(带符号和无符号形式)和 _Bool
。在这些选项中,标准规定您可以使用 _Bool
、unsigned int
、signed int
和“普通”int
:
“plain” int 的行为是由实现定义的:它可以是有符号的或无符号的(类似于“plain” char 可以是有符号的或无符号的)。因此,jxh 的评论是正确的;我引用了太多类型,不够仔细(但我已经重新表述了它,使其不那么误导人)。ISO/IEC 9899:2011 §6.7.2.1结构和联合类型说明符
¶5 位域必须具有限定或未经限定的版本,其类型为
_Bool
、signed int
、unsigned int
或其他某种实现定义的类型。是否允许原子类型是由实现定义的。
_Bool
,int
和unsigned int
是标准的。其他所有类型都是实现定义的。 - jxhsnprintf()
和sscanf()
)。我不确定在哪里列出_Complex
;它可能像结构体和联合体一样复合。我也没有提到数组,但数组有一个基本类型,尝试操作位数组并没有太多意义,因为C中并没有真正的位类型。等等。你说得对;一旦你经过了各种选择,整数是唯一的真正选项。 - Jonathan Leffler整数是一组简单的加权位。它们安静、低调,并且容易进行位操作。
几乎每种其他数据类型都需要进行某种形式的解释:浮点数有两个部分,即尾数和指数;字符串是……好吧,是字节(或Unicode值)的字符串。结构体或数组指针可以表示几乎任何东西。
例如,我可以轻松地将32位存储在一个整数中,并像这样检索它们(类C伪代码):
int GetBit(int field, int position)
{
return field & 1 << position;
}
返回值是一个整数,其值为1或0。
一个字节(8位)可以说是计算机系统中最基本的单位;计算机不能直接检索小于一个字节的位数,现在大多数计算机以多字节的方式检索位。 32位计算机一次检索... 32个位; 这就是我们谈论的32位整数。
C.11 §6.7.2.1 ¶10:位域应具有限定或未限定版本的
_Bool
、signed int
、unsigned int
或其他某些实现定义的类型。实现定义了是否允许原子类型。
如果您想了解位域如何使用,通常会使用位域来创建比其基础类型更小的类型。正如名称所示,预计该类型的“变量”对于位操作是有用的。传统上,位操作是使用整数类型进行的,这是直观的。位域被解释为具有指定位数的带符号或无符号整数类型。如果将值 0 或 1 存储到类型为
_Bool
的非零宽度位域中,则位域的值应与存储的值相等;_Bool
位域具有_Bool
的语义。
char
可以成为位域的标准类型,同样适用于更长的整数类型。 - jxh