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