位域

1.位域:与位运算有关系,与结构体也有关系。

  • int a:4;表示a只占4位。这就是位域,限定数据的位数,主要是为了节约内存。
  • 如果输入, int a:4; 那么默认是会留一个符号位,所以你可以用的就是3位。若需要无符号的需要加上unsigned。

2.类型相同是多个数据能重合就重合 。

struct test
{
    unsigned int num1:1;
    unsigned int num2:1;
};
sizeof(struct test);    这时test的大小是4个字节,

 


3.若是类型不同,则遵循结构体对齐原则。
一个位域必须存储在同一个字节中,不能跨两个字节。如果一个字节所剩空间不够存放另一位域是,应从下一单元起存放该位域。也可以有意识某位域从下一单元开始。

4.在计算机中,补码在内存中的排列是,  低位在低字节,高位在高字节。高位就是1,低位就是0。比如0000 0001就是1000 0000这样子存储的。如果要打印,则就需要逆序打印。

5.现代的手机(android和ios),电脑,都是低位低字节,linux也是,unix服务器是例外。

 

位域操作:

#include <stdio.h>
#include <stdlib.h>

struct bits
{
    unsigned char ch1 : 1;
    unsigned char ch2 : 1;
    unsigned char ch3 : 1;
    unsigned char ch4 : 1;
    unsigned char ch5 : 1;
    unsigned char ch6 : 1;
    unsigned char ch7 : 1;
    unsigned char ch8 : 1;
};

int main()
{
    //printf("大小是:%d",sizeof(struct bits));
    int data = 1;
    int length = 4;
    struct bits *p = &data;

    while (length--)
    {
        printf("%d%d%d%d% d%d%d%d\n",
            (p + length)->ch8,
            (p + length)->ch7,
            (p + length)->ch6,
            (p + length)->ch5,
            (p + length)->ch4,
            (p + length)->ch3,
            (p + length)->ch2,
            (p + length)->ch1
        );
    }
    system("pause");
}

 

posted @ 2016-07-22 15:47  芬乐  阅读(316)  评论(0编辑  收藏  举报