C++ 不明确的位域语句

C++ 不明确的位域语句,c++,bit,C++,Bit,下面的注释对我来说[在一本C++书中]似乎是模棱两可的 可以声明未命名的位字段来创建填充,以实现特定的对象布局。 class s { public: int i:1; }; int main() { s x; x.i=1; cout<<x.i<<endl; //outputs -1 return 0; } 作者想从上述注释中传达什么 我试着理解以下程序,但仍然不清楚 class s { public: u

下面的
注释
对我来说[在一本C++书中]似乎是
模棱两可的

可以声明未命名的
位字段
来创建填充,以实现特定的对象布局。

class s
{
    public:
    int i:1;
};

int main()
{
    s x;
    x.i=1;
    cout<<x.i<<endl; //outputs -1
    return 0;
}
作者想从上述注释中传达什么

我试着理解以下程序,但仍然不清楚

class s
{
    public:
    unsigned  i:1;
};

int main()
{
    s x;
    x.i=1;
    cout<<x.i<<endl; //outputs 1
    return 0;
}
另一个问题

class s
{
    public:
    int i:1;
};

int main()
{
    s x;
    x.i=1;
    cout<<x.i<<endl; //outputs -1
    return 0;
}
s类
{
公众:
int i:1;
};
int main()
{
sx;
x、 i=1;
cout一个未命名的位字段,顾名思义,是一个没有名称的字段。您的
无符号i:1;
不是未命名的;它的名称是
i
。名称是可选的;类型不是

C标准(我将引用)在6.7.2.1p12中说:

一种位字段声明,没有声明符,只有冒号和 宽度,表示未命名的位字段。作为特例,位字段 宽度为0的结构成员表示没有更多的位字段 要打包到单元中,在该单元中,前一个位字段(如果有), 被放置

例如:

struct foo {
    unsigned int x:1;
    unsigned int  :0;
    unsigned int y:1;
};

请注意,位字段不能用于可靠地指定对象布局,因为它们表示的许多方面都是由实现定义的。

在“unsigned i”中,关键字“unsigned”不是成员的名称,而是类型。“i”是名称(确实是可选的)。第二个是带符号的int(在x86上,不确定其他名称)与非负值具有相同数量的负值。因此,对于一位,值为-1和0。(我要睡觉了。如果有人想将其扩展为完整答案,请放心)我有两个问题。您在“含糊不清”的引号中发现了哪两个或更多含义;为什么您认为代码不应该编译和工作?