关于位域个人理解

 

作者:曹忠明,华清远见嵌入式学院讲师。

有很多学生问我,为什么很多地方都说位域不能跨越两个字节,而自己写得程序明显看到某一位域跨越的两个字节,为此感到不解。下面我说一点我个人的理解。先看例子:

#include <stdio.h>
    struct date1
        {
             short a:4;
             short b:5;
             short c:4;
    };

struct date2
    {
             short a:4;
             short b:5;
             short c:8;
     };

struct date3
    {
            short a:4;
             short b:5;
            int c:8;
     };

int main()
    {
            printf("%d\n %d\n %d\n",sizeof(struct date1),
               sizeof(struct date2), sizeof(struct date3));
            return 0;
    }

程序的结果是:
     2
     4
     4

在例子中的date1中的位于b明显是跨越了两个字节,为什么和定义的不一样呢。那么我们再看一下date2,date2的大小是4,我想这里正式说明位域不能跨越两个字节的说法。我认为说位域不能跨越两个字节是说当当前数据类型不能存放下剩余的位域,那么这个位域不能跨越两个字节存放,而是重新分配一个当前数据类型大小的空间存放。这也就说明了为什么date1是合理的。date3中有两个数据类型的位域,两个short型一个int型,那么这个位域是怎么存储的呢?例子的结果显示这个结构的大小只有4,显然不是为short分配一段空间,再为int分配一段空间,而是将这三个位域全部放进了一个int型数据中存储。由此可以看出,位域在允许的情况下尽量少的空间存放多的数据。是一个为我们节省空间的好东西。

这里只是个人理解,有什么问题希望大家留言,共同探讨!

你可能感兴趣的:(职场,休闲,位域)