C 规范在位域上下文中“重叠相邻单元”意味着什么?

问题描述 投票:0回答:1

我正在努力理解 C 语言规范 (6.7.2.1.11) 的位域部分:

实现可以分配任何足够大的可寻址存储单元来容纳位字段。如果 仍有足够的空间,结构中紧随另一个位字段的位字段应为 打包到同一单元的相邻位中。如果剩余空间不足,则是否存在位字段 不适合放入下一个单元或与相邻单元重叠是实现定义的。 [...]

我总是在溢出的位域被移动到下一个分配单元的假设下进行编程;例如

struct {
    uint8_t bits0_3 : 4;
    uint8_t bits4_7 : 4;
    uint8_t overflowing: 1; // <-- this bit will overflow into a second byte
};

但是,本段指定实现可以决定使其“重叠相邻单元”。这究竟意味着什么?

overflowing
位是否可以与
bits0_3
重叠,就像在一个并集中一样?

c bit-fields implementation-defined-behavior
1个回答
1
投票

他们的意思是这样的:如果位域不能完全放入前一个位域的存储单元,那么它可以(1)跳到下一个存储单元并将位域放在那里,或者(2 )它可以将其拆分,将其一部分放置在前一个存储单元中,其余的放置在下一个存储单元中。 这就是他们所说的“重叠相邻单元”的意思。

例如,假设您有:

struct {
    uint8_t a:5;
    uint8_t b:6;
    uint8_t c:3;
}

打包这些字段的一种方法是使用 3 个独立的 8 位整数,其中

a
b
c
每个都放置在自己的 8 位整数中。 但它也可以将它们分开,以便
a
和 3 位
b
位于第一个 8 位整数中,而
b
的其他 3 位与
c
一起放置在第二个 8 位整数中位整数。

© www.soinside.com 2019 - 2024. All rights reserved.