gpt4 book ai didi

关于 C 中位域排序语义的说明

转载 作者:太空狗 更新时间:2023-10-29 15:22:12 26 4
gpt4 key购买 nike

我很难理解 C99 草案标准 (N1256) 中一段关于位域 (6.7.2.1:10) 的确切含义:

6.7.2.1 Structure and union specifiers

[...]

Semantics

[...]

An implementation may allocate any addressable storage unit large enough to hold a bit-field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.

强调的句子把我的英语水平发挥到了极致:我不明白它是指一个单元内的各个位域,还是各个位域内的位排序或其他什么。

我会尝试用一个例子来阐明我的疑问。假设 unsigned int 是 16 位,实现选择 unsigned int 作为可寻址存储单元(并且字节是 8 位宽),并且不会出现其他对齐或填充问题:

struct Foo {
unsigned int x : 8;
unsigned int y : 8;
};

因此,假设xy 字段存储在同一个单元中,那么根据该语句定义的实现是什么?据我了解,这意味着在该 unsigned int 单元内, x 可以存储在比 y 更低的地址,反之亦然,但我不确定,因为直觉上我认为如果没有位字段与两个底层存储单元重叠,声明顺序将对底层位字段施加相同的顺序。

注意:恐怕我在这里遗漏了一些术语的微妙之处(或者更糟的是,一些技术术语),但我无法理解是哪个。

任何指针表示赞赏。谢谢!

最佳答案

我真的看不出有什么不明白的地方

The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined.

它讨论的是位域的分配,而不是域内的位。因此,除了非位域成员之外,您无法确定可寻址单元内位域的排序顺序。

否则,位域本身的表示保证与基础类型“相同”,分为值位和符号位(如果适用)。

本质上,它表示包含位字段的存储单元的结构是实现定义的,您不应该尝试通过其他方式(union 左右)访问这些位,因为这会使您的代码不可移植。

关于关于 C 中位域排序语义的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18652148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com