我很难理解关于位域(6.7.2.1:10)的一段 C99 草案标准(N1256)的确切含义:
6.7.2.1 结构和联合说明符
[...]
语义
[...]
实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间,结构中紧跟在另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则将不适合的位域放入下一个单元还是与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。
强调的句子将我的英语技能发挥到了极限:我不明白它是指一个单元内的单个位域,还是指单个位域内的位排序或其他东西。
我会试着用一个例子让我的疑问更清楚。假设无符号整数是 16 位,实现选择无符号整数作为可寻址存储单元(并且字节为 8 位宽),并且不会出现其他对齐或填充问题:
struct Foo {
unsigned int x : 8;
unsigned int y : 8;
};
因此,假设x
和y
字段存储在同一个单元内,那么根据那句话实现定义是什么?据我了解,这意味着在该 unsigned int 单元内部,x
可以存储在低于y
或反之亦然的低地址,但我不确定,因为直觉上我认为如果没有位字段与两个底层重叠存储单元,声明顺序将对底层位字段施加相同的顺序。
注意:我担心我在这里遗漏了一些微妙的术语(或者,更糟糕的是,一些技术术语),但我不明白是哪个。
任何指针表示赞赏。谢谢!