我无法理解 C99 草案标准 (N1256) 中关于位字段 (6.7.2.1:10) 的确切含义:
强调的句子将我的英语技能扩展到了极限:我不明白它是指单元内的单个位域,还是单个位域内的位排序或其他什么。
我会试着用一个例子让我的怀疑更清楚。让我们假设无符号整数是 16 位,实现选择无符号整数作为可寻址存储单元(并且字节是 8 位宽),并且没有其他对齐或填充问题出现:
struct Foo {
unsigned int x : 8;
unsigned int y : 8;
};
因此,假设
x
和 y
字段存储在同一个单元中,根据那句话,实现定义是什么?据我了解,这意味着在 unsigned int 单元中,x
可以存储在比 y
低的地址,反之亦然,但我不确定,因为直觉上我认为如果没有位字段与两个底层存储单元,声明顺序将对底层位域强加相同的顺序。注意 :我担心我在这里遗漏了一些微妙的术语(或者更糟的是,一些技术性的),但我不明白是哪一个。
任何指针表示赞赏。谢谢!
最佳答案
我真的不明白什么是不清楚的
它讨论的是位域的分配,而不是域内的位。因此,除了非位域成员之外,您无法确定可寻址单元内的位域是按什么顺序排序的。
否则,位域本身的表示保证与基础类型“相同”,分为值位和符号位(如果适用)。
从本质上讲,它表示包含位字段的存储单元的解剖结构是实现定义的,您不应该尝试通过其他方式(union
左右)访问位,因为这会使您的代码不可移植。
关于澄清 C 中的位域排序语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18652148/