当你写代码时
struct {
unsigned a:3, b:2;
} x = {10, 11};
在 ANSI C(C89)中,x.b
是否保证为 3
?我已经阅读了标准多次,但似乎没有找到确切的情况。
例如,“无法由结果无符号整数类型表示的结果会对大于结果无符号整数类型所能表示的最大值加一取模”,这是关于计算而不是初始化。而且,位域并不真正是一种类型。
此外,(当谈到 unsigned t:4 时)“包含范围在 [0,15] 的值”,但这并不意味着初始化程序必须被“对16取模”以映射到 [0,15]。
结构体初始化的描述非常详细,但我真的找不到确切的行为。(当然,编译器确实会这样做。IBM 文档说“当将超出范围的值赋给位域时,低位模式将被保留,并分配适当的位。”,但我想知道 ANSI C 是否标准化了这一点。
{10&0x07,11&0x03}
初始化程序。哦,我同意您关于标准在此问题上不够具体的看法。 - Sergey Kalinichenko