Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 位字段和并集大小 #包括 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,并且在并集中

在这个问题中,联合的大小将不同于为联合分配的位字段的数量。有人能解释一下区别吗。。剩下的内存会怎么样

面团!大小将填充为4字节(在大多数实现中)


因此,“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

然后,此
结构的大小将至少为2
char
s(如果需要,加上任何其他填充)。大多数情况下,它的大小实际上是2
unsigned 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;
};