• 位域结构体


    位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。

    规则:

    1. 位结构中的成员可以定义为unsigned, 也可定义为signed或者是char, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
    2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。
    3. 位结构总长度(位数), 是各个位成员定义的位数之和(如果类型相同的话)
    4. 位结构成员可以与其它结构成员一起使用。
    a:由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
    b:位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
    c:如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止。

    举例

    要注意位定义是:先定义的存储低位,后定义存储高位,不足在高位加0补齐

    我们再来看看下面两个结构体定义:
    1
    struct foo2 {
    char    a : 2;
    char    b : 3;
    char    c : 1;
    };

    struct foo3 {
    char    a : 2;
    char    b : 3;
    char    c : 7;
    };
    我们来打印一下这两个结构体的大小,我们得到的结果是:
    sizeof(struct foo2) = 1
    sizeof(struct foo3) = 2
    2
    struct
    {
    unsigned short s1:3; //一个字节.

    unsigned short s2:3; //一个字节
    unsigned short s3:3; //一个字节
    }x;
    sizeof(x)
    为9位(相邻类型相同可以共用)而最终结果为了内存对齐(对齐为2的倍数).取为2.
    3
    struct {
     int a:2;
     int b:4;
     char c;
     }x;
    int main(void)
    {
    printf("%d",sizeof(x));//8
    }

    #include <stdio.h>
    struct {
        short int a:2;
        int b:4;
        char c;
        }x;
    struct {
        int a:2;
        int b:4;
        char c;
        }x1;
    struct {
        short s1:3;
        short s2:3;
        short s3:3;
        }x2;
    struct{
        char c1:3;
        char c2:2;
        char c3:2;
        }x3;
    int main(void)
    {
    printf("%d
    ",sizeof(x));
    printf("%d
    ",sizeof(x1));
    printf("%d
    ",sizeof(x2));
    printf("%d
    ",sizeof(x3));
    }

    12
    8
    2
    1
    请按任意键继续. . .

  • 相关阅读:
    20172303 2017-2018-2 《程序设计与数据结构》实验一报告
    20172303 2017-2018-2 《程序设计与数据结构》第3周学习总结
    20172303 2017-2018-2 《程序设计与数据结构》第2周学习总结
    20172303 2017-2018-2 《程序设计与数据结构》第1周学习总结
    预备作业03
    预备作业02
    预备作业01
    日语学习笔记
    [Redux] redux之combineReducers
    [Vue] vue跳转外部链接
  • 原文地址:https://www.cnblogs.com/zzy-frisrtblog/p/6198088.html
Copyright © 2020-2023  润新知