【发布时间】:2014-06-29 19:37:30
【问题描述】:
当你写作时
struct {
unsigned a:3, b:2;
} x = {10, 11};
x.b 是否被 ANSI C (C89) 保证为 3?我已经阅读并重新阅读了标准,但似乎无法找到确切的情况。
例如,“不能用 得到的无符号整数类型以数字为模减少 比可以表示的最大值大一 产生的无符号整数类型。”说的是计算,而不是初始化。而且,位域并不是真正的类型。
另外,(当谈到无符号 t:4 时)“包含 [0,15] 范围内的值”,但这并不一定意味着初始化器必须以 16 为模减少映射到 [0,15]。
结构初始化确实是煞费苦心地详细描述,但我似乎真的找不到确切的行为。 (当然编译器就是这样做的。IBM 文档说“当您将超出范围的值分配给位字段时,会保留低位模式并分配适当的位。”,但我想要了解 ANSI C 是否对其进行了标准化。
【问题讨论】:
-
如果将位域视为实体,并按字面解释标准,那么“任何初始化器都不应尝试为未包含在正在初始化的实体中的对象提供值”将禁止此类初始化为尝试为位域之外的位提供值。我不确定这种解释是否正确。在任何情况下,我都会避免这种情况,而是使用明确的
{10 & 0x07, 11 & 0x03}初始化程序。哦,我同意你的观点,标准在这个问题上不够具体。 -
当然没有人会用真实的代码来写这个。这是 C89 课程测试中的一个潜在问题。我认为这不是一个好问题,因为有人可能会做出不同的回答,而我们仍然无法证明他是错的。
-
我同意,这对于测试来说将是一个糟糕的问题,除非您正在测试一个打算编写编译器的人(即使那样这将是一个非常棘手的问题)。
-
只是为了确保没有误解......不,测试的问题不是“x.b 保证为 3”,而只是“x.b 会是什么”。他们不必知道标准的每一个字母,如果有挑剔的人说没有指定,我们只是想掩饰自己。 :-)
标签: c struct initialization ansi bit-fields