求大神指教C语言中的位域

为什么以下的 sizeof(A) 和 sizeof(B)都是4呢?

struct A
{
int a:5;
int b:3;
}

struct B
{
int a:3;
int b:2;
int c:3;
}

这两个结构体在内存中又是如何存储的呢? 求指教

两个数据结构的位域都在整形(4字节)里分配, 如果不足一个整形的部分就按一个整形算

下面的图说明了位域在内存里的存储情况, 可以看到, 两种情况下位域都只占了一个字节, 不足一个整形(4字节), 所以就按一个整形算


追问

如果我把struct A改为
struct A
{
char a:4;
char b:4;
short i:8;
long m;
}

这是sizeof(A)为什么又是8了啊。。

追答

a, b 占1字节
i占2字节
m占4字节

所以这个结构一共占7字节。但sizeof()得到8是因为内存对齐。
32位计算机中,为了内存的存取速度, 一次会读取4个字节。 在储存数据时, 也会按照4字节一个单元把数据对其。
比如这个例子里, a,b在第1个字节, i在第2,3个字节, m放在第5~8个字节, 而不是4~7字节, 这样在读取m时只需要一次内存操作。(如果在4~7字节需要先读取1~4字节, 再读取5~8字节)
如果你把i和m的顺序换一下, sizeof结果会不一样, 也是这个原因

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-03
两个数据结构都用整型来分配位域,即使没有全部把整型的32个位用完,sizeof仍然算整个整型的大小4字节。

这两个数据结构都是用了整型的1字节8个比特,在大头字节序的CPU上,这个字节是整型的最低位字节,其他高位的3字节没有用到。在这个字节内部,按变量定义的顺序,从低位到高位依次存放。
struct A里,a在整型第一字节的低位5个比特,b在整型第一字节高位3个比特。struct B类似。追问

谢谢你的回答
大头字节序的CPU 指的是? 是小端机吗

追答

譬如ARM是小头字节序,PowerPC是大头字节序。区别就是高位字节放在前还是放在后。

第2个回答  2013-05-03
你搞错了把!应该是8和12把!
第3个回答  2013-05-03

求大神指教C语言中的位域
两个数据结构的位域都在整形(4字节)里分配, 如果不足一个整形的部分就按一个整形算 下面的图说明了位域在内存里的存储情况, 可以看到, 两种情况下位域都只占了一个字节, 不足一个整形(4字节), 所以就按一个整形算

C语言位域(位段)详解
在C语言中,位域是一种数据结构,它允许数据存储时只需要占用部分二进制位,而不是一个完整的字节。这特别适用于状态较少的数据,如开关只有通电和断电两种状态,用0和1表示就足够了。因此,C语言提供了位域这一特性,以高效存储此类数据。位域在结构体定义时通过成员变量后的数字来限定其所占用的二...

C语言中的 :1; 是什么意思?
位域,将一个字节的8位分别命名为PTBD0 ,PTBD1,PTBD2……PTBD8

C中的位域和位段,请帮我解释下,最好举个例子。
其中位域a占8位,位域b占2位,位域c占6位。 对于位域的定义尚有以下几点说明: 1) 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。 例如: struct bs { unsi...

让人疑惑的C语言位域
C 语言中的位域声明形式为 b0、b1、b2 ...,成员占用的位数为 n0、n1、n2 ...。但位域的范围不能超过所依附类型(如 unsigned int)的总 bit 数,超出部分会被截断。例如,当给一个只有 7 位的字段赋值 0x8F,超过的 bit 将被忽略。位域的存储方式取决于编译器,有相邻成员紧邻存储和新...

C 语言中一个位域(位段)结构占多少个字节?
在C语言中,位域或位段是一种用于节省存储空间的数据结构。它的设计原则是只占用必要的二进制位,如开关量只有0和1两种状态,只需一个位即可存储。定义位域时,通常采用三种方式:先定义后说明、同时定义说明、直接说明。声明时,位域成员应为整型或枚举类型,且通常使用无符号类型。位域可以是无名域...

c语言 位域长度
这个主要还是要看编译器以及程序的运行环境。例如普通32位的环境中,位域可以定义为32bit,超过32bit就会报错。我的理解是LZ书上看到的位域不允许跨2字节是由于运行环境是8bit的。因此在单片机编程中可以定义16bit的ul类型(该单片机的位宽应该是大于等于16bit的)。我在自己的64位系统上编写了类似的...

c语言中如何定义位域数组?
定义位域数组可以使用结构体类型。例如:c struct my_bitfield { unsigned char b1 : 1;unsigned char b2 : 1;unsigned char b3 : 1;};这里创建了一个名为 `my_bitfield` 的结构体,包含三个位域:`b1`、`b2` 和 `b3`,它们分别占用 1 位。接着定义一个包含 10 个 `my_bitfield` ...

C语言结构体位域的简单介绍
结构体在C语言中是一种复合数据类型,允许包含多种数据类型,如同学生信息表。例如:声明结构体方式为:在32位操作系统中,使用sizeof函数获取结构体占用的字节大小。例如:理解结构体占用字节大小时,需考虑数据类型所占字节数。例如:结构体的内存对齐是指CPU以32位(4字节)为单位进行数据访问。若数据...

结构体位域使用
在C语言中,位域是一种特殊的数据结构,用于在存储时节省空间并简化处理。它将一个字节的二进制位划分为多个独立的区域,每个区域都有特定的位数,通过域名进行操作,适用于存储如开关量(只需1位)或非标准文件格式(如9位整数)等只需要少量位的信息。位域的定义与结构体类似,以struct开头,接着是...

相似回答