C++ 如何阅读C++;位域定义?
我需要一些帮助来理解位字段定义的语法。我在上面阅读了Microsoft文档页面,但是那里的示例仍然留下了我的问题。给定如下所示的位字段和主方法: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; } 为了更好地参考我的要求,这里编号为
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之间填充字符,但在字符和颜色之间,就像这里使用的位字段一样,所以我认为这两者之间没有任何填充。