精华内容
参与话题
问答
  • C/C++ 位域定义

    千次阅读 2019-02-14 10:11:30
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...

    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
    一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: 

    struct 位域结构名 
    {
    
     位域列表
    
    };

    其中位域列表的形式为:

    类型说明符 位域名:位域长度

    位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:

    struct bs
    {
      int a:8;
      int b:2;
      int c:6;
    }data; 

    说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:


    1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
     

    struct bs
    {
        unsigned a:4
        unsigned b:5 /*从下一单元开始存放*/
        unsigned c:4
    }

    2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度

    3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

    struct k
    {
    int a:1
    int :2 /*无位域名,该2位不能使用*/
    int b:3
    int c:2
    };

    二、位域的使用

    下面例子是参加一个公司(白领科技-青岛)的笔试遇到的,当时做错了,为了怕忘了,赶紧写下来。

     1 #include <iostream>
     2 #include <memory.h>
     3 using namespace std;
     4 struct A
     5 {
     6     int a:5;
     7     int b:3;
     8 };
     9 int main(void)
    10 {
    11     char str[100] = "0134324324afsadfsdlfjlsdjfl";
    12         struct A d;
    13     memcpy(&d, str, sizeof(A));
    14     cout << d.a << endl;
    15     cout << d.b << endl;
    16     return 0;
    17 }

    在32位x86机器上输出:

    $ ./langxun.exe

    -16

    1

    解析:在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体里面最长的元素为对其单位,即结构体的长度一定是最长的数据元素的整数倍;如果有结构体内存长度大于处理器位数的元素,那么就以处理器的位数为对齐单元。由于是32位处理器,而且结构体中a和b元素类型均为int(也是4个字节),所以结构体的A占用内存为4个字节。

    上例程序中定义了位域结构A,两个个位域为a(占用5位),b(占用3位),所以a和b总共占用了结构A一个字节(低位的一个字节)。

    当程序运行到14行时,d内存分配情况:

     高位 00110100 00110011   00110001    00110000 低位
           '4'       '3'       '1'          '0'  
     其中d.a和d.b占用d低位一个字节(00110000),d.a : 10000, d.b : 001

     d.a内存中二进制表示为10000,由于d.a为有符号的整型变量,输出时要对符号位进行扩展,所以结果为-16(二进制为11111111111111111111111111110000)

     d.b内存中二进制表示为001,由于d.b为有符号的整型变量,输出时要对符号位进行扩展,所以结果为1(二进制为00000000000000000000000000000001)

     三、位域的对齐

      如果结构体中含有位域(bit-field),那么VC中准则是:

      1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

      2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

      3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;

      系统会先为结构体成员按照对齐方式分配空间和填塞(padding),然后对变量进行位域操作。

    展开全文
  • 位域的定义和使用

    千次阅读 2018-03-06 12:05:57
    位域 : 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据...

    位域 :  

    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。位段成员必须声明为int、unsigned int或signed int类型(short char long)。

    一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:     

    struct 位域结构名     
    { 位域列表 };  

    其中位域列表的形式为: 类型说明符 位域名:位域长度     
    例如:     

    struct bs     
    {     
    int a:8;     
    int b:2;     
    int c:6;     
    };  

    位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:     

     View Code

    说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:     

    1. 如果一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:     

    复制代码
    struct bs     
    {     
    unsigned a:4     
    unsigned :0 /*空域*/     
    unsigned b:4 /*从下一单元开始存放*/     
    unsigned c:4     
    }     
    复制代码

    这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。     

    2.位域的长度不能大于数据类型本身的长度,比如int类型就能超过32位二进位。

    3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:     

    复制代码
    struct k     
    {     
    int a:1     
    int :2 /*该2位不能使用*/     
    int b:3     
    int c:2     
    };  
    复制代码

    从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。     

    二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名.位域名 位域允许用各种格式输出。     

     

    复制代码
    struct bs     
    {     
        unsigned a:1;     
        unsigned b:3;     
        unsigned c:4;     
    } bit,*pbit;     
    bit.a=1;     
    bit.b=7; //注意:位域的赋值不能超过该域所能表示的最大值,如b只有3位,能表示的最大数为7,若赋为8,就会出错   
    bit.c=15;
    
    printf("%d,%d,%d/n",bit.a,bit.b,bit.c);
    pbit=&bit;
    pbit->a=0;
    pbit->b&=3;
    pbit->c=1;
    printf("%d,%d,%d/n",pbit->a,pbit->b,pbit->c);
    复制代码

    上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。 

    程序的9、10、11三行分别给三个位域赋值。( 应注重赋值不能超过该位域的答应范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针 方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为 3)。同样,程序第16行中使用了复合位运算"=", 相当于: pbit->c=pbit->c1其结果为15。程序第17行用指针方式输出了这三个域的值。 

    我们再来看看下面两个结构体定义:

    复制代码
    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
    显然都不是我们期望的,如果按照正常的内存对齐规则, 这两个结构体大小均应该为3才对,那么问题出在哪了呢?首先通过这种现象我们可以肯定的是:带有'位域'的结构体并不是按照每个域对齐的,而是将一些位域 成员'捆绑'在一起做对齐的。以foo2为例,这个结构体中所有的成员都是char型的,而且三个位域占用的总空间为6 bit < 8 bit(1 byte),这时编译器会将这三个成员'捆绑'在一起做对齐,并且以最小空间作代价,这就是为什么我们得到sizeof(struct foo2) = 1这样的结果的原因了。再看看foo3这个结构体,同foo2一样,三个成员类型也都是char型,但是三个成员位域所占空间之和为9 bit > 8 bit(1 byte),这里位域是不能跨越两个成员基本类型空间的,这时编译器将a和b两个成员'捆绑'按照char做对齐,而c单独拿出来以char类型做对齐, 这样实际上在b和c之间出现了空隙,但这也是最节省空间的方法了。我们再看一种结构体定义:

    struct foo4 {
    char    a : 2;
    char    b : 3;
    int c : 1;
    };

    在foo4中虽然三个位域所占用空间之和为6 bit < 8 bit(1 byte),但是由于char和int的对齐系数是不同的,是不能捆绑在一起,那是不是a、b捆绑在一起按照char对齐,c单独按照int对齐呢?我们 打印一下sizeof(struct foo4)发现结果为8,也就是说编译器把a、b、c一起捆绑起来并以int做对齐了。就是说不够一个类型的size时,将按其中最大的那个类型对齐。此 处按int对齐。


    C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,
    允许其它类型类型的存在。
    使用位域的主要目的是压缩存储,其大致规则为:

    1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止
    2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
    3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++,GCC采取压缩方式;
    4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
    5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
    复制代码
    struct s1 
    { 
    int i: 8; 
    int j: 4; 
    int a: 3; 
    double b; 
    }; 
    
    struct s2 
    { 
    int i: 8; 
    int j: 4; 
    double b; 
    int a:3; 
    }; 
    
    printf("sizeof(s1)= %d/n", sizeof(s1)); 
    printf("sizeof(s2)= %d/n", sizeof(s2)); 
    result: 16, 24 
    复制代码


    第一个结构体中,i,j,a共占15个位,不足8个字节,按double 8字节对齐,共16字节

    第二个结构体中,i,j共占12位,不足8字节,按8字节对齐,a也按8字节对齐,加上double共8+8+8=24个字节

    展开全文
  • c语言位域详解

    千次阅读 2017-12-16 10:49:03
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...
    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

    一、位域的定义和位域变量的说明

    位域定义与结构定义相仿,其形式为:

    struct 位域结构名

    {

     类型说明符  位域名:位域长度

    ......

     };


    例如:
    struct bs
    {
        int a:8;
        int b:2;
        int c:6;
    };

    位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。

    [注:]关于结构变量的定义说明方式请参考c语言结构定义

    例如:

    struct bs
    {
        int a:8;
        int b:2;
        int c:6;
    }data;

    说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。

    对于位域的定义尚有以下几点说明:

    1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
    例如:
    struct bs
    {
        unsigned a:4;
        unsigned :0;
        unsigned b:4;
        unsigned c:4;
    }
    在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用
    4位,c占用4位。
    2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
    3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
    struct k
    {
        int a:1;
        int :2;
        int b:3;
        int c:2;
    };
    从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的

    二、位域的使用

    位域的使用和结构成员的使用相同,其一般形式为:
    位域变量名·位域名
    位域允许用各种格式输出。
    main(){
        struct bs
            {
                 unsigned a:1;
                 unsigned b:3;
                 unsigned c:4;
            } bit,*pbit;
        bit.a=1;
        bit.b=7;
        bit.c=15;
        printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
        pbit=&bit;
        pbit->a=0;
        pbit->b&=3;
        pbit->c|=1;
        printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
    }
    上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=",该行相当于:pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=".之所以要有透析基础知识这么个分栏,就是告诉大家重 在细节的道理,粗略的东西谁都懂,修炼内功为高手的必经之路.
    前面的内容存在缺陷,具体还要参考如下文章:
    C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。

    位域使用的规则:
    1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
    2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
    3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
    4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
    5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

    typedef struct  AA
    {
           unsigned char b1:5;
           unsigned char b2:5;
           unsigned char b3:5;
           unsigned char b4:5;
           unsigned char b5:5;
    }AA;

    sizeof(AA) = 5; 但实际上只用了25位,即4个字节,

    (1)typedef struct  AA
    {
           unsigned int b1:5;
           unsigned int b2:5;
           unsigned int b3:5;
           unsigned int b4:5;
           unsigned int b5:5;
    }AA;

     

    (2)typedef struct  AA
    {
           unsigned int b1:5;
           unsigned int b2:5;
           unsigned int b3:5;
           unsigned int b4:5;
           unsigned int b5:5;
           unsigned int b6:5;
           unsigned int b7:5;
    }AA;

    (1)是5个成员,按第一条规则,共占25位,按第五条规则,即sizeof(AA)=4
    现把成员加到7个,参考(2),按第一条规则,共占35位,按第五条规则,即sizeof(AA)=8,

     

    再看一个例子:

     struct test1

    {

    char a:1;

    char :2;

    long b:3;

    char c:2;

    };

    int len = sizeof(test1);

    对于上述例子,len的值应该是12.解释如下: 

    首先以最长的类型位宽做为偏移量,最长的是long型,占4位,所以不同类型之间应该是4个字节的偏移,即test1应该是4字节的整数倍。 

    char a:1; //用一个字节去存储

    char :2;  //空域。因为与前面的a的类型相同,而两个位域的位宽相加仍然少于8位,所以依然用1个字节表示

    long b:3; //long类型的位宽是4个字节,与前面的char类型不同,所以b与a之间偏移4个字节,它们之间自动补充3个字节 

    char c:2; //因为c与b又不同型,以test1中的最长的long类型的位宽进行偏移,所以虽然char只用1个字节就够了

    //但依然要占4个字节。

    总共是12字节。

     

     

    ///

    struct s1

    {

      int i: 8;

      int j: 4;

      int a: 3;

      double b;

    };

    struct s2

    {

      int i: 8;

      int j: 4;

      double b;

      int a:3;

    };

    printf("sizeof(s1)= %d\n", sizeof(s1));

    printf("sizeof(s2)= %d\n", sizeof(s2));

    result: 16, 24


    展开全文
  • 位域(位段)

    2019-05-25 15:45:00
    位域(位段)  有些信息在存储时,并不需要占用一个完整的字节,而只需要占用一个或几个二进制位。 例如: 存放一个开关量时,只有0和1二种状态,只保存一位二进制位即可。为了节省存储空间,C语言提供了...

    位域(位段)

      有些信息在存储时,并不需要占用一个完整的字节,而只需要占用一个或几个二进制位。

    例如: 存放一个开关量时,只有0和1二种状态,只保存一位二进制位即可。为了节省存储空间,C语言提供了数据结构:位域。

      位域是把字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个区域有个域名,允许在程序中按域名

    进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

    位域的定义

      位域定义与结构体定义相仿,形式为:

    struct 位域结构名

    {

      类型名  位域名: 位域长度,如 int a 8;  //位域长度不能大于8(即一个字节)

      ......

    };

     

    注意:

      一个位域必须存储在一个字节中,当有二个连续的位域,在一个字节中存放第一个位域后剩下的空间不足以存放第二个

    位域,则第二个位域将存放在下一个字节单元中,前一个字节多余的位补0。(因为一个位域必须存储在一个字节,所以位域长度最大为8)

     

     
    1 struct wy
    2 {
    3   unsigned int a : 4; //第一个字节前4位存放该位域
    4   unsigned int b : 5; //第一个字节剩下的4位不足以存放b,位域b从下一个字节开始
    5 }WY;
    6 sizeof(WY) == 4;位域存储的类型是int占用4个字节,根据内存对齐规则不足4字节也占用4字节。对齐规则可以往下看

     

    空域:

      不管当前字节单元剩下的位数是否足以存放下一个位域,使用空域后,下一个位域都存放到下一个类型单元,比如int就存放到下个int单元

     
    1 struct wyn
    2 {
    3   unsigned int a : 4; //第一个字节前4位存放该位域
    4   unsigned int :0;
    5   unsigned int b : 2; //空域后的位域从下个单元开始
    6 }WYN;
    7 sizeof(WYN) == 8; 因为存储的类型是int型,空域后,从下个int开始
     
     

    wyn nn;  nn.a = 6; //给a赋值为6其实是把a占用的4位赋值为 0110

     当一个位域无位域名时,它只是用来作为填充或调整位置,不能被使用(比如 int :3 仅仅是用来占3位二进制位,但这3位没法在程序里使用)。

    位域内存对齐规则

    1 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof(类型)大小,则后面的字段紧邻前一个字段存储。

    2 如果相邻位域字段的类型相同,且其位宽之和大于类型的sizeof(类型)大小,则后面的字段从新的存储单元开始,其偏移量为sizeof(类型)大小的整数倍

    3 如果相邻位域字段的类型不同,则各编译器的具体实现有差异,需要在编译器上测试

     

     
    1 struct wyn
    2 {
    3   unsigned int i : 8;
    4   unsigned int j : 4;
    5   unsigned int a : 3;
    6   double b;
    7 }WYN; 8 sizeof(WYN) == 16;
    i,j,a共占用2个字节,根据规则1,紧邻的int型i,j,a共占用4字节。
    b位double型,占用8字节,根据对齐规则,b的内存地址必须是8的整数倍,所以在i,j,a后会填充4个字节,再存储b。
     
     
     
    1 struct wyn2
    2 {
    3   unsigned int i : 8;
    4   unsigned int j : 4;
    5   double b; 
    6   unsigned int a : 3;
    7 }WYN2; 8 sizeof(WYN2) == 24;
    同上面WYN一样,根据规则1,2:i,j,b占用16字节
    位域a占用3位,类型是int应该占用4字节,但是整个结构体大小应该按照最大的类型double对齐,必须是8的整数倍。所以占用24字节
     
     
     

     

    posted on 2019-05-25 15:45 锋邢天下 阅读(...) 评论(...) 编辑 收藏

    展开全文
  • 位域,内存,大小端详解

    千次阅读 2016-03-03 11:33:54
    听到好几个朋友说到去一些公司做面试,总是遇到关于大小端、位段(或者叫位域)和内存对齐的考题,然后就不知所措了。虽然我认为很多开发根本就用不到这个,但是我认为很有必要学习理解这些知识点,因为它可以让你更...
  • 位域的用法

    2018-12-03 16:18:11
    位域  有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据...
  • 位域

    2018-10-03 12:48:00
    位域 位域是C语言的一种变量结构,最主要的一个特点就是可以节省空间并且实现位操作的方式。最近在一个项目中要用到它,其实我理解位域但本来没想要用它,只是上司出于好心指导的目的让我用...
  • 【C语言笔记】位域

    千次阅读 2019-02-15 21:56:26
    位域的概念 有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种数据...
  • 位域详解

    2019-02-09 13:46:48
    有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。...所谓“位域”是把一个字节中的二进位划分为几个不同的区域...
  • C/C++ struct位结构(位域

    万次阅读 2011-02-23 10:58:00
    从问题开始#includevoid main(){union{struct{unsigned short s1:3;unsigned short s2:3;unsigned short s3:3;}x;char c;}v;v.c=100;printf("%d/n",v.x.s3);}A:4 B:0 C:3 D:6答案是A但我在TURBO C中运行答案是1请问 ...
  • 位域(bit fields)简介

    千次阅读 2013-11-28 17:53:17
     位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构...
  • C语言位域精解

    千次阅读 2015-02-05 16:10:57
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...
  • 原文:http://blog.csdn.net/IdoIwill/archive/2008/09/21/2956890.aspxC语言里的位域是一个比较复杂的问题,涉及的方面也比较多,关于位域的基础内容可以参考以下文章:理解C语言位域 分析代码如下:#include ...
  • C语言位域问题

    2014-02-26 14:17:50
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,  并说明每个区域的位数。每个域有一个域名,允许
  • 理解C语言位域

    2008-08-04 15:45:00
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...
  • 正是基于这种考虑,C语言又提供了一种数据结构,叫做“位域”或“位段”。 位域是操控位的一种方法(操控位的另一种方法是使用按位运算符,按位运算符将在之后的笔记中做介绍)。 位域通过一个结构声明来建立:该...
  • C语言位域操作

    千次阅读 2016-10-21 13:54:33
    传统的位域,可以方便的实现位操作,但是需要对结构体整体读出时比较麻烦。如果有些场合需要对位进行操作,又有把结构体整体读出需求时,往往让人不知所措,这事可以用联合体+结构体(位域)的方法实现。 位域的...
  • C语言位域的操作

    2013-04-24 22:30:20
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...
  • C语言位域的使用方法

    千次阅读 2016-08-30 23:10:14
    C语言位域的使用方法最近看到国外的众筹网站有体感服参与,了解了一些,用到了30个九轴传感器(陀螺仪、加速度计、地磁计),心想自己也来做一个,所以首先选择了BMX055这款(考虑到价格相对便宜,之前用过MPU9150,...
  • C语言位域(位段)详解 有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又...
  • 为什么80%的码农都做不了架构师?>>> ...
  • C语言位域大小的计算

    2020-09-20 12:10:15
    结构体计算大小原则 原则一、结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址...1.如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧
  • C语言位域

    2017-09-10 16:20:10
    C语言提供了一种数据结构,称为“位域”或“位段”。位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,所谓“位域”是把一个字节中的二进位划分...
  • 写在前面
  • 当结构体成员为int型时,它是有正负的,给c一个位并赋值为1,则它的符号位也是1,最后答应出来就是-1。给b两个位并赋值为2,即11,它的符号位也就是1,最后打印出来 就是-2。 #include<stdio.h>...
  • C语言 位域

    2018-05-22 16:00:38
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...
  • c语言位域

    2010-10-10 16:07:00
    转:...为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域
  • C语言位域理解

    2016-06-28 13:54:33
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...
  • C语言位域总结

    2012-02-12 22:34:24
    为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名...
  • C语言位域(位段)

    2015-11-08 20:36:34
    所以C语言又提供了一种数据结构,称为位域或位段。 位域在应用开发中较少使用,你可以暂时跳过,遇到相关问题再回来温习。 所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每...

空空如也

1 2 3 4 5 ... 20
收藏数 15,924
精华内容 6,369
关键字:

位域