C语言篇之位字段

1、

C语言篇之位字段_第1张图片

 

2、

C语言篇之位字段_第2张图片

 

3、

 

4、

C语言篇之位字段_第3张图片

注意一:

《C Primer Plus》一书中说位字段是一个signed int 或是unsigned int 中一组相邻的位(C99还支持_Bool类型位字段),然而我实际操作过程中,这种表述是不对的,我用unsigned short或是其他类型的都行。如下面的代码:

/*********************************************************************************
 *
 *       Filename:  bit_field.c
 *    Description:  This file 
 *         Author:  fulinux <[email protected]>
 *      ChangeLog:  1, Release initial version on "05/02/2013 05:00:47 PM"                                                                                                                                                             
 *                 
 ********************************************************************************/

#include <stdio.h>

struct _bit_field{
        unsigned short field1 : 1;
        unsigned short        : 8;
        unsigned short field2 : 3;
        unsigned short        : 3;

        unsigned short field3 : 8;
        unsigned short        : 8;
    };

union __views {
    unsigned int ui;
    struct _bit_field stuff;
} views;


void itobs(unsigned int n, char *ps)
{
    int i;
    static int size = 8 * sizeof(unsigned int);

    for(i = size - 1; i>=0; i--, n >>= 1)
    {
        ps[i] = (01 & n) + '0';
    }
    ps[size] = '\0';

    printf("bits are %s\n",ps);
}

/********************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 ********************************************************************************/
int main (int argc, char **argv)
{
    char str[8 * sizeof(unsigned int) + 1];

    views.stuff.field1 = 1;
    views.stuff.field2 = 7;
    views.stuff.field3 = 255;
    printf("%d\n",sizeof(unsigned int));

    itobs(views.ui,str);

    return 0;
} /* ----- End of main() ----- */


注意二:

有网友说由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度(见:点击打开链接),这也是不对的而是不能跨结构体中的类型。例如下面的结构体,他可以跨一个字节,而不能跨4个字节,不然他就会以下一个unsigned int类型开始存放位域。

struct _bit_field{         unsigned short field1 : 1;         unsigned short        : 8;         unsigned short field2 : 3;         unsigned short        : 3;

unsigned short field3 : 8;         unsigned short        : 8;     };


执行结果如下:

 

你可能感兴趣的:(int,位字段,1,a)