在C/C++中我们有时为了节省内存占用空间,需要使用到位域,如下所示代码:

struct SDummy {   int A : 2;   int B : 8;   int C : 12;   int D : 10; };

    在计算机内存昂贵的情况下,位域不乏为一种有效的节省内存占用空间又让代码书写比较通俗易懂的方法。但是在现今内存相对便宜的时代,应用软件中似乎已经很少见到位域的使用了。位域的使用,在学习C语言的时候有学习过,但是在实际项目中很少用到,也没有仔细去研究它,直到上周我为了让一个64位的变量表示我所需要的几个信息时,才将它仔细去研究了一番。

    我在最近的项目中,需要一个变量,通过这个变量能知道其表示的年月日时分秒等信息。由于我想使年可表示20年即可,故需要5位来表示;月共12月,需要4位;日共31日,需要5位;时共24小时,需要5位;分60分,需要6位;秒60秒,需要6位;当然还有其它信息,我也根据需要分配了相应位的位域。于是我写出了如下所示代码:

struct SDummy {   U8  Year : 5;   U8  Month : 4;   U8  Day : 5;   U8 Hour : 5;   U8 Minute :6;   U8 Second : 6;   U16 ID1;   U16 ID2; };

这个结构中的U8就是unsigned char,U16就是unsigned short。但是程序的运行结果并不是按照我的想法所得的结果。这个结构并不是我想要的用64位就可以表示,而是超过了64位所用8字节,它占用了10个字节。前面的年月日时分秒部分就占用了6个字节,后面几个U16的部分占用了4个字节,所以总共占用了10个字节。其中的原因就是前面几个位域部分的类型用的是U8,一个U8是占用一个字节的。由于Year占用5位,Month占用4位,加起来超过U8的8位,所以Year与Month就只得各占一个8位;后面的位域同理,故所有位域占用了6个字节。明白这个原因后,我将上述代码中的U8改为U32(即unsigned int),就达到了我想要的效果了!即改写成:

  struct SDummy   {     U32 Year : 5;     U32 Month : 4;     U32 Day : 5;     U32 Hour : 5;     U32 Minute :6;     U32 Second : 6;     U16 ID1;     U16 ID2;   };

这个结构的大小就刚好占用64位,8个字节的大小。