C++ 如何阅读C++;位域定义?

C++ 如何阅读C++;位域定义?,c++,bit-fields,C++,Bit Fields,我需要一些帮助来理解位字段定义的语法。我在上面阅读了Microsoft文档页面,但是那里的示例仍然留下了我的问题。给定如下所示的位字段和主方法: struct { unsigned short character : 8; unsigned short color : 4; } text[80]; int main() { text[20].character = 'a'; text[20].color = 5; } 为了更好地参考我的要求,这里编号为

我需要一些帮助来理解位字段定义的语法。我在上面阅读了Microsoft文档页面,但是那里的示例仍然留下了我的问题。给定如下所示的位字段和主方法:

struct {
    unsigned short character : 8;
    unsigned short color     : 4;
} text[80];

int main() {
    text[20].character = 'a';
    text[20].color = 5;
}
为了更好地参考我的要求,这里编号为:

  • 这里的
    [80]
    [20]
    是什么意思
  • text[80]
    是否表示包含80个这样的结构的数组
  • text[20]。character='a'
    是否意味着在数组的第20位有一个字符
    'a'
  • “这里的
    [80]
    [20]
    是什么意思?”

    text[80]
    声明一个包含80个元素的数组,并
    text[20]
    访问第21个元素

    “文本[80]是否表示80个这样的结构的数组?”

    text[20]。character='a'
    是否意味着在数组的第20位有一个字符'a'

    这里的[80]和[20]是什么意思

    [80]表示定义您定义的匿名类型的数组(已定义的结构)。 让我清楚地告诉你发生了什么。由于unsigned short是16位,因此此结构将是一个16位内存,前8位命名为字符,中间4位命名为颜色,不使用4个结束位

    您从此结构创建了一个包含80个元素的数组。这意味着内存中有80个连续的16位;每个元素(16位)都有一个字符(8位)、一个颜色(4位)和4个未使用的位


    位域在底层软件和嵌入式系统中非常有用。例如,在您的场景中,消费者似乎在等待数据,其前8位将被视为字符(ASCII),其下4位将被视为该字符的颜色。因此,80个元素的数组表示80个有自己颜色的字符。

    所有这些问题看起来都与位字段无关。如中所示,您可以删除位字段并提出相同的问题。“由于无符号短字符为16位”
    无符号短字符
    至少有2个字节。它可以更大。“这意味着内存中有80个连续的16位”这不是必须的。编译器可以添加填充。@ThomasSablik首先,关于unsigned short,根据标准,您是对的,它至少是16位。但根据我所看到的,在LP32、ILP32、LLP64、LP64实现中,无符号short的大小将是16位。@ThomasSablik Second,关于数组元素之间的填充,我确信它不是现成的。因为若数组元素之间有填充,那个么我们就不能轻易地将数组转换为指针。请参阅“我看到在LP32、ILP32、LLP64和LP64实现中,无符号短码的大小将是16位。”但在其他实现中,它可以更大。您可以在
    字符
    之前以及
    字符
    颜色
    @ThomasSablik之间填充字符,但在字符和颜色之间,就像这里使用的位字段一样,所以我认为这两者之间没有任何填充。