C语言中关于位域的疑问?

struct BitField
{
unsigned int a:4; //a占用第一个字节的前4位,后面的4个二进制位不使用,自动置0
unsigned int :0;
unsigned int b:4; //占用4个二进制位,从下一个存储单元开始存放;
unsigned int c:4; //占用4个二进制位;
unsigned int d:5;
unsigned int :0;
unsigned int e:4; //占用4个二进制位,从这个存储单元开始存放;
};

这是看到的解释,小弟还有几个疑问搞不懂:
1、在unsigned int a:4与unsigned int b:4;中,为什么a占用第一个字节的前4位,后面的4个二进制位不使用,而b占用4个二进制位,从下一个存储单元开始存放?
2、在这里unsigned int a:4,unsigned int b:4,unsigned int c:4,unsigned int e:4这几个在存储上有啥区别?
3、unsigned int d:5不够存储该怎么办?

请大侠帮帮小弟。谢谢了!!!

       unsigned int  :0;

宽度为 0 有特殊含义,表示如果前面一个 bit field 没有占满一个存储单元,那么这一个存储单元剩下的位就不使用了。


不够存储就用下一字节。

追问

在unsigned int a:4与unsigned int b:4;中,为什么a占用第一个字节的前4位,后面的4个二进制位不使用,而b占用4个二进制位,从下一个存储单元开始存放?

追答

因为在a的定义后面,定义了一个宽度为0的 bit field

追问

位在字节中存储的规律是什么?

追答

没规律。看编译器心情

温馨提示:内容为网友见解,仅供参考
无其他回答

让人疑惑的C语言位域
C 语言中引入的位域是为了存储那些只需要少量二进制位的数据,如电灯的通电状态。位域允许以紧凑方式处理二进制位,特别在早期计算机内存紧张时,能节省存储空间。位域的主要优势在于节省空间和提升操作效率。例如,在网络应用中,频繁的序列化和反序列化操作中,减少数据长度可以大大提高数据打包效率。使用...

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

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

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

C中的位域和位段,请帮我解释下,最好举个例子。
不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。 例如: struct bs { unsigned a:4 unsigned :0 \/*空域*\/ unsigned b:4 \/*从下一单元开始存放*\/ unsigned c:...

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

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

求c语言大神,关于位段的问题
即010011,十进制19,所以a的值是-19 b 13, 0xcd是二进制11001101,b只取低6位,001101,最高位是0表示正数,1101即十进制13 c 13, 0xad是二进制10101101,c只取低5位,01101,最高位是0表示正数,1101即十进制13 d 157, 0x9d按32位取,最高位是0表示正数,十进制即157 ...

C语言的结构体位定义问题
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按...

在下向前辈请教:在C语言中,201位的变量如何定义?
C中的位域必须定义为struct内部变量,如 struct{ unsigned long long x:63;}y;x后面用于表示x占用的位数,该位数不能比x前变量类型可表示的位数大。可以用y.x来引用。因此,常规下C语言能表示的最大位数是64(例如在VC中)。无法实现楼主的目的。只能采用数组的方式,并自行编写算法来记录及显示该...

相似回答