相关推荐recommended
C语言【位段篇】
作者:mmseoamin日期:2024-03-04

位段

  • 1.什么是位段
  • 2.位段的内存分配
  • 3.位段的跨平台问题

    前言:相信大家写题的时候,都会遇到这种问题:这个专业名词是什么?不知道,算了,不做了(反正也不是能力问题)

    位段这个名词就很常见,接下来,砸门来聊一聊有关位段的这些事

    1.什么是位段

    位段的结构和声明和结构体是类似的,有两个不同:

    1.位段的成员必须是整形家族(int、unsigned int、signed int或者是char)

    2.位段的成员名后边有一个冒号和数字

    🌰

    struct S
    {
    	int a : 5;
    	int b : 7;
    	int c : 30;
    };
    //S就是一个位段类型
    

    那我们就有疑问了:

    位段为甚么是这种的结构(:数字),这样做的好处是什么?位段S的大小是多少?

    那么我们带着这样的疑问进入到下一部分。

    2.位段的内存分配

    位段中的 位 是 “二进制位”

    一般一个位段类型里面的成员都是一个类型的

    有了前面的知识铺垫,我们就知道了:位段中冒号后面的数字是给这个成员分配的比特位。以上面的例子而言:a就分配了5个比特位,b分配了7个比特位,c分配了30个比特位

    在上面的例子中,位段在内存中是以四个字节开始分配的(因为每一个成员都是int)

    C语言【位段篇】,第1张

    C语言【位段篇】,第2张

    那么我们就有一个疑问:上一个四个字节没用完,那么又开辟了四个字节,还用不用上一个存留的比特位呢?

    这个问题,C语言中并没有明确的规定,这是取决于编译器的。

    那么,我们来看看在VS编译器中的情况是怎么样的:

    🌰

    #include
    struct S
    {
    	char a : 3;
    	char b : 4;
    	char c : 5;
    	char d : 4;
    };
    int main()
    {
    		struct S s = { 0 };
    		s.a = 10;
    		s.b = 12;
    		s.c = 3;
    		s.d = 4;
    		return 0;
    }
    

    C语言【位段篇】,第3张

    C语言【位段篇】,第4张

    3.位段的跨平台问题

    那照这样来说:位段的结构和作用都和结构体一样,而且更节省空间一些。

    以后我们不用结构体,直接用位段多好,答案是no!no!no!

    让我们来看看位段的一些缺陷与不足:

    1. int 位段被当成有符号数还是无符号数是不确定的。
    2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
    3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
    4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

    总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在

    C语言【位段篇】,在这里插入图片描述,第5张

    作者码文不易,希望各位看官一键三连哦💕💕