C 位字段和并集大小 #包括 main() { 工会d { 无符号整数a:1; 无符号整数b:3; 未签名:0; 无符号整数d:1; 无符号整数e:1; }; 联盟d aa; aa.b=9; printf(“d.aa.a=%d d.aa.b=%d”,aa.a,aa.b); 系统(“暂停”); }
在这个问题中,联合的大小将不同于为联合分配的位字段的数量。有人能解释一下区别吗。。剩下的内存会怎么样 面团!大小将填充为4字节(在大多数实现中)C 位字段和并集大小 #包括 main() { 工会d { 无符号整数a:1; 无符号整数b:3; 未签名:0; 无符号整数d:1; 无符号整数e:1; }; 联盟d aa; aa.b=9; printf(“d.aa.a=%d d.aa.b=%d”,aa.a,aa.b); 系统(“暂停”); },c,C,在这个问题中,联合的大小将不同于为联合分配的位字段的数量。有人能解释一下区别吗。。剩下的内存会怎么样 面团!大小将填充为4字节(在大多数实现中) 因此,“a”指的是第一位(紧靠第零位:-)位,“b”指的是前三位,“d”和“e”都指的是同一个32位(4字节)字的第一位。计算机体系结构有一定的字长。虽然如果正确使用,声明位字段是有效的,但是如果字长是可变的,则声明位字段是无效的。我认为大多数编译器出于效率的考虑会填充位。简单地说,其余的位在大多数情况下都会丢失 为简单起见,假设字长为8,并且在并集中
因此,“a”指的是第一位(紧靠第零位:-)位,“b”指的是前三位,“d”和“e”都指的是同一个32位(4字节)字的第一位。计算机体系结构有一定的字长。虽然如果正确使用,声明位字段是有效的,但是如果字长是可变的,则声明位字段是无效的。我认为大多数编译器出于效率的考虑会填充位。简单地说,其余的位在大多数情况下都会丢失 为简单起见,假设字长为8,并且在并集中使用2和3的位字段。我用字母来表示各个位
#include<stdio.h>
main()
{
union d
{
unsigned int a:1;
unsigned int b:3;
unsigned :0;
unsigned int d:1;
unsigned int e:1;
};
union d aa;
aa.b=9;
printf("d.aa.a=%d d.aa.b=%d",aa.a, aa.b);
system("pause");
}
在我的示例中,将使用前3位a、b和c,编译器将确保不使用其余的位
我可以用更好的语言来解释
但是,在联合中使用位字段?我不确定这是个好主意
希望我的解释有帮助。有任何关于包含位字段的类型大小的疑问吗?,标准说(C11 6.7.2.1 p11): 一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段 由于这是一个
联合
,联合中的所有成员仅使用无符号整数
中的不超过3位,因此联合
的大小至少应为字符
的大小,加上系统所需的填充(如果有)。在许多系统上,它会将每个单元填充到位字段所针对的类型的大小,因此在这种情况下,我希望联合
的大小与无符号整数
的大小相同(尽管这可能是由于正常的联合
填充要求而发生的)
0
大小的位字段在联合中是一个模糊的概念,但在结构中它有特殊的含义(C11 6.7.2.1 p12):
没有声明符但只有冒号和宽度的位字段声明表示
未命名位字段。作为特例,一个宽度为0的位字段结构成员
指示不需要将更多的位字段打包到前一位字段(如果有)所在的单元中
因此,如果您的联合
是一个结构
:
a b c d e f g h
然后,此结构的大小将至少为2char
s(如果需要,加上任何其他填充)。大多数情况下,它的大小实际上是2unsigned int
s.更多作业?(). 内存访问和字节对齐突然浮现在脑海中。总线只有一定的大小,因此不使用备用座位。联合是最大项目的大小…而且,您不能有无符号int
的一小部分,因此大小将四舍五入为“整”无符号int
。您在printf
中缺少某些内容。tim.cc:in函数“int main()“:tim.cc:14:7:警告:大整数隐式截断为无符号类型[-Woverflow]tim.cc:15:35:警告:格式“%d”需要匹配的“int”参数[-Wformat]请稍候,“无符号:0;”是什么意思?不,在您的场景中,联合体的大小至少为4。这些是位字段,加起来小于32,因此联合体的大小可能为4。面团!,现在我明白了。在编写设备驱动程序和嵌入式固件时,总是在联合体中使用位字段:-)通常是register@tallen谢谢你的信息,我不知道。在struct
的情况下,0宽度位字段的这一特殊含义有实际用途吗?@asembansal:这显然是无符号:CHAR\u bit*sizeof(unsigned)-bit\u字段的缩写,在我之前就有了。
。数学上是合适的,但实际上我在实际应用程序中要求任何好处。@asembansal:更直接地回答你的问题,它显式地创建填充,以允许将来向该特定单元添加新位。位字段声明为无符号int
,并具有一种类型无符号int
,用于计算,这并不意味着它或它所在的联合或结构实际具有无符号int
的大小。根据C 2011(n1570)6.7.2.1 11,“一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。”并集可以是一个字节,显示的结构可以是两个字节。
struct d
{
unsigned int a:1;
unsigned int b:3;
unsigned :0;
unsigned int d:1;
unsigned int e:1;
};