位域

【C语言】位域、无名位域和空域详解 C语言不太好学的原因之一就是有大量这类复杂的抽象概念,容易把人绕晕,所以必须结合图片、动画、实际开发中的场景和编译代码片来逐步讲解,在经过了这一轮的理解之后,重新再看这些概念,便会觉得它们很熟悉且通俗易懂,在实际编程中你也能通过开发经验来自行判断技术方案的优势和劣势分别是什么,从而使用适合你的实际开发场景的技术方案。在C语言中,是一种特殊的,允许程序员按位(bit)操作和存储数据,从而节省内存空间。位域可以指定字段的位宽,限制某个成员占用的位数。位域在嵌入式编程、通信协议解析等场景中非常常见。 阅读详情

1. 位域的定义

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

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

位结构定义的一般形式为:
struct 
位结构名{
   
数据类型 [变量名]: 整型常数;   //成员称为“位域”或者“位段”
   
数据类型 [变量名]: 整型常数;
}
位结构变量;

其中: 数据类型必须是整型(包括字符型)。整型常数的范围是数据类型的长度, 如定义为short,则范围是1~16,也就是说,当定义一个short类型的成员位段时,它的整形常数取值范围必须在0-16之间,超出范围编译器将报语法错。具体范围如下:

类型

整形常数范围

char, unsigned char

1-8

short, unsigned short

1-16

int, unsigned

1-32

long, unsigned long

1-32

当然上面的范围值也可以是0,但是作用不同,后面会提到。
例如:

struct webpage{
    unsigned char incon: 8;      // incon
占用低字节的0~7共8位
    unsigned char txcolor: 4;   // txcolor
占用高字节的0~3位共4位
    unsigned char bgcolor: 3;  // bgcolor
占用高字节的4~6位共3位
    unsigned char blink: 1;      // blink
占用高字节的第7位
}ch;
printf("%d\n", sizeof(struct webpage));

输出结果:2。

 

2. 位域的对齐与计算

上面结构体大小为2,但是,为什么会是2呢?先来了解下,结构体的对齐原则:

1). 若相邻成员变量类型相同,且其位宽之和不大于成员变量类型位宽(在此严重强调,是类型位宽而不是成员变量sizeof,也不是类型的sizeof或者其他什么)大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2).
如果相邻位域字段的类型相同,但其位宽之和不大于成员变量的类型宽度大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3).
如果相邻的位域字段的类型不同,不同位域字段存放在不同的位域类型字节中(这一条其实会根据编译器的不同而采用不同的规则)。

例如:

struct A
{
    char c1:1;
    char c2:3;
    unsigned short s2:13;
    unsigned long i:3;
};

printf(“%d\n”, sizeof(struct A));

我们先分析下,如果遵循上面的对齐原则,结果应该会是多少。

c1, c2符合原则2,类型相同,那么就是 c1占1位,在0上;c2占3位在1~3上,因为后面的unsigned short与c1, c2不是同类型,符合原则3,所以存储在新的字节上。即c1, c2在一个字节上; s2占13位,在0-12上,也因和后面的i不是同类型,所以存储在新字节上,即s2占两个字节。i占3位,在0-2上,占四个字节。

即:1 + 2 + 4 = 7,但实际上,结构体还有个原则要遵守,即:和结构体一样,位结构体也是按照成员的最大长度字节来对齐分配空间的。如顺序读到的位域中最长的那个字节数对齐,如为4字节的long,则按4字节对齐。若最长仅为char,则按char对齐。即依次按读取到的数据类型进行对齐,并计算出最后的sizeof()!所以,这里最大的成员类型是4个字节,结构体的大小会是它的倍数,所以为距7最小4的倍数是8。得出,上面位结构体大小为:8,VC 6.0下输出结果也为8。

但是,在Code::Blocks 10.5中,输出结果却为4。也就是说,它并没有遵循上面的原则3。所以,原则3会和具体的编译环境有关。

 

如果位域上的整形范围值是0,则下个位域从新的字节开始(即使是同类型的位域),如:

struct bs
{
    unsigned a:4;
    unsigned :0;      //
空域
    unsigned b:4;    //
从新字节开始存放
    unsigned c:4;
} ;

上面这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从新的字节开始,占用4位,c占用4位。上面位结构体大小为:8

 

3. 位域的访问

位结构成员的访问与结构成员的访问相同。例如: 访问下例位结构中的bgcolor成员可写成ch.bgcolor 进行访问:
struct webpage{
    unsigned char incon: 8;      // incon
占用低字节的0~7共8位
    unsigned char txcolor: 4;   // txcolor
占用高字节的0~3位共4位
    unsigned char bgcolor: 3;  // bgcolor
占用高字节的4~6位共3位
    unsigned char blink: 1;      // blink
占用高字节的第7位
}ch;

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

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

 

注意:
1.
一个位域必须存储在定义它的一个数据类型内部,不能跨跨该数据类型。如char定义的位域所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
2.
由于位域不允许越过定义它的数据类型,因此位域的长度不能大于定义它的数据类型的长度。
3.
位结构总长度(位数), 是各个位成员定义的位数之和再向最大结构成员对齐。
4.
位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned char state: 1;
unsigned char pay: 1;
}workers;
上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结构成员只有一位, 用unsigned char数据类型,因此只占一个字节但保存了两个信息, 该字节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

 

这里有篇文章也写的不错http://blog.youkuaiyun.com/juliababy/article/details/2873796

=====================================================================================

一、首先说概念:

位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。
位结构定义的一般形式为:
struct  位结构名{
数据类型 [变量名]: 整型常数; //成员称为“位域”或者“位段”
数据类型 [变量名]: 整型常数;
} 位结构变量;
其中: 数据类型必须是整型(int/char/short)。 整型常数的范围是数据类型的长度, 如定义为short,则范围是1~16。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct webpage{
unsigned char incon: 8; /*incon占用低字节的0~7共8位*/
unsigned char txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned char bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned char blink: 1; /*blink占用高字节的第7位*/
}ch;
printf("%d/n",sizeof(struct webpage));输出:2。
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor

注意:
1. 一个位域必须存储在定义它的一个数据类型内部,不能跨跨该数据类型。如char定义的位域所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
2.由于位域不允许越过定义它的数据类型,因此位域的长度不能大于定义它的数据类型的长度。
3. 位结构总长度(位数), 是各个位成员定义的位数之和再向最大结构成员对齐。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned char state: 1;
unsigned char pay: 1;
}workers;
上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结构成员只有一位, 用unsigned char数据类型,因此只占一个字节但保存了两个信息, 该字节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

二、再说说位结构的位域存储顺序问题

我们知道字节存储顺序有高字节优先的big-endian大端存储法(高字节数据放在低字节地址处)和低字节优先的little-endian小端存储法,无论使用大端法还是小端法,都不存在技术原因,只是涉及到处理器厂商的立场和习惯。INTEL的X86平台使用小端法,IBM、Motorola、Sun Microsystem的大多数微处理器则使用大端法,还有部分微处理器可以由用户自己设置是使用大端法还是小端法,如ARM、MIPS、PowerPC等。
位域在存储时的顺序和它的编译器有关,一般是先申请的放在低位。程序举例如下:

小端???

# include "stdio.h"
void main()
{
  union
 {
  struct student
 {
   unsigned char s1 : 1;
    unsigned char s2 : 3;
 }x;
  unsigned char c;
 }v;
 v.c = 0;
 v.x.s1 = 0;
 v.x.s2 = 4;
printf( "%d/n",v.c);
printf( "%d/n", sizeof( struct student)); 
}
输出:
8
1

即结构体成员申请是按照顺序从低地址开始。所以上边结构体v在内存中数据的排列顺序为

    s1 s2
    |0| 0|0|1| 0|0|0|0| (1个字节,因为是unsigned char类型)
低地址       高地址


s1放着0
s2放着4(二进制100),在内存里由低到高为“|0|0|1|”。
所以v.c为二进制00001000,即十进制8。
同时,因为s1占一个位,s2占三个位,而两者都是unsigned char型,且最大的数据类型也就是unsigned char型,一个字节足够放下s1和s2了。所以我们看到struct student的大小为1个字节。
如果从先申请的放在高字节,则上边的输出为
           s2  s1
0000 |001 |0
即输出应该是:
64
1
网上有人说TURBO C是采用这种方式,我没试过。

三、位结构的位对齐问题
位结构的其实不存在位对齐问题,即位不需要对齐。其他方面,位结构和一般结构体类似,遵循结构体的对齐原则,

# include "stdio.h"

void main()
{
  union
 {
  struct student
 {
   unsigned char s1 : 1;
    unsigned char s2 : 2;
   unsigned char s3 : 2;
 }x;
  unsigned char c;
 }v;
 v.c = 0;
 v.x.s1 = 0;
 v.x.s3 = 2;
printf( "%d/n",v.c);
printf( "%d/n", sizeof( struct student)); 
}
输出结果是:
16
1

因为它只按整体对齐,所以为
s1s2s3
0  0001000
即二进制00010000等于十进制16,而不是
s1s2    s3
0  00 0 01 00

再举一个位结构体的例子

# include "stdio.h"
void main()
{
  union
 {
  struct student
 {
   unsigned char s1 : 1;
    unsigned char s2 : 2;
   unsigned short s3 : 2;
 }x;
  unsigned short c;
  unsigned int d;
 }v;
 v.d = 0;
 v.x.s1 = 0;
 v.x.s3 = 2;
printf( "%d/n",v.d);
printf( "%d/n", sizeof( struct student)); 
}
输出为:
131072
4

131072=(10 00000000 00000000)b
因为遵循结构体对齐原则,s3跳过了2个字节。
s1s2                               s3
0  00 00000| 00000000| 01

 

如下代码

# include "stdio.h"   
struct  kk  
{  
unsigned a : 2;  
unsigned b : 3;  
unsigned c : 2;  
unsigned d : 1;  
}  
kt;  
int  main()  
{  
         char  result = 3;  
        memcpy( &kt, &result, 1);  
        printf( " a = %d, b = %d, c = %d, d = %d,ok/n" ,kt.a,kt.b,kt.c,kt.d);  
          return   1;  
}  


在sun unix上用cc编译,结果为 0, 0, 1, 1

在 2000上用VC6. 0编译,结果为 3, 0, 0, 0


又如:

struct kk  {  
    char a : 2;  
    char b : 3;  
    char c : 2;  
    char d : 1;  
} kt;  


int main()  
{  
         char result = 3; 

        memcpy( &kt, &result, 1); 

        printf( "a = %d, b = %d, c = %d, d = %d/n",kt.a,kt.b,kt.c,kt.d); 

         return 1;  
}

file bit
bit: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.0, not stripped
./bit
a = 0, b = 0, c = 1, d = 1

$ file bit
bit: PE32 executable for MS Windows (console) Intel 80386 32-bit
$ ./bit
a = -1, b = 0, c = 0, d = 0

=================================================

C语言的位域虽然很多人强烈建议不要使用,但现有系统里还广泛存在位域的使用,所以还是很有必要理清楚的。

对big-endian和little-endian的区别,很多人认为是对多字节数据类型而言。其实,问题的本质不在这里。

两种endian区别的本质是由于CPU的数据引脚和系统地址总线的连接方向的不同。也就是说,高地址,低地址的区别不仅体现在“字节序”上,还体现在“比特序”上,只不过因为系统屏蔽了“比特序”的一些细节,所以看起来问题仅仅是字节之间的顺序问题了。

所以,对字节序相关的问题,如果能从两个角度来看问题,就很直接明了了。

先从系统地址总线的角度来分析数据的存放,然后从CPU的数据引脚的角度来解析数据....(对网络字节,可从网络数据传送地址的角度分析数据的存放,思想类同)

废话少说,分析一下上面的例子程序。(所有图表都从系统地址总线的角度看各个bit位)

C语言的位域中,每个field是严格按照bit地址从低到高排列的:

因此,从地址总线的角度看,四个域的排列顺序是(用于解析)

==============

-低->->->高-

  a b c d

==============

 

接下来看如何解析这个字节。

在little-endian机器上,result字节中各个比特的存放排列如下所示

==============

-低->->->高-

 ,11000000,

==============

对应到四个位域,得

a=3

b=0

c=0

d=0

 

在big-endian机器上,result字节中各个比特的存放排列如下所示

==============

-低->->->高-

 ,00000011,

==============

对应到四个位域,得

a=0

b=0

c=1

d=1

 

总结:

1.  C语言的位域类型使用时,各个field的摆放是按从低到高的bit顺序排列的。

2.  把数据的存放和解析分开,就可以很容易解释字节序的问题。

 

是这样的。这里有个术语的混淆。当多个字节组成一个长字(long)时,不同体系结构的cpu会按不同的方法来解释高低字节的顺序,这是字节序。小端的cpu会将低地址的字节认为是长字值的低位,高地址的字节认为是长字值得高位。大端的正好相反。

而在一个字节之内,不同体系结构的cpu会按不同的方法来解释高低比特的顺序,这是比特序。 小端的cpu将低位的比特认为是值得低位,高位的比特认为是值得高位。大端的正好相反。假设固定总线上的比特地址,从0比特到7比特的内存数据是 0 0 0 0 0 0 0 1。那么,小端的cpu读到的值就是0x80,而大端的cpu读到的值就是0x01。

INTEL的cpu字节序和比特序都是小端的。POWERPC的cpu一般都是大端的. 

明白以上道理,你可以分析IP header了.

struct  iphdr  
  {  
# if __BYTE_ORDER == __LITTLE_ENDIAN   
     unsigned   int  ihl : 4;  
     unsigned   int  version : 4;  
#elif __BYTE_ORDER == __BIG_ENDIAN   
     unsigned   int  version : 4;  
     unsigned   int  ihl : 4;  
# else   
# error "Please fix <bits/endian.h>"   
# endif   
    u_int8_t tos;  
    u_int16_t tot_len;  
    u_int16_t id;  
    u_int16_t frag_off;  
    u_int8_t ttl;  
    u_int8_t protocol;  
    u_int16_t check;  
    u_int32_t saddr;  
    u_int32_t daddr;  
      /*The options start here. */   
  };  



以及 tcp header
struct  tcphdr  
  {  
    u_int16_t source;  
    u_int16_t dest;  
    u_int32_t seq;  
    u_int32_t ack_seq;  
#   if __BYTE_ORDER == __LITTLE_ENDIAN   
    u_int16_t res1 : 4;  
    u_int16_t doff : 4;  
    u_int16_t fin : 1;  
    u_int16_t syn : 1;  
    u_int16_t rst : 1;  
    u_int16_t psh : 1;  
    u_int16_t ack : 1;  
    u_int16_t urg : 1;  
    u_int16_t res2 : 2;  
#  elif __BYTE_ORDER == __BIG_ENDIAN   
    u_int16_t doff : 4;  
    u_int16_t res1 : 4;  
    u_int16_t res2 : 2;  
    u_int16_t urg : 1;  
    u_int16_t ack : 1;  
    u_int16_t psh : 1;  
    u_int16_t rst : 1;  
    u_int16_t syn : 1;  
    u_int16_t fin : 1;  
#   else   
#   error "Adjust your <bits/endian.h> defines"   
#   endif   
    u_int16_t window;  
    u_int16_t check;  
    u_int16_t urg_ptr;  
};
C++位域详解 #include int main() { //1.位域允许我们使用内存最小单位BIT位来存储数据,某些情况下可以为我们节省内存 //2.位域是以数据类型来区分区域的,几种数据类型就表示有几个位域段( 未指定占用位,除外 ) //3.同种位域类使用BIT位超过该位域数据类型大小自动完后继续占用该位域数据类型大小 //4.未用完的BIT位还是要占用内存空间的即不存在只使用int类型的其中4 阅读详情

相关推荐

Linux C高级结构体位域的10个常见问题

在Linux嵌入式开发中,使用结构体位域是一种常见的技术,它可以在有限的内存空间中存储和访问多个变量。然而,由于结构体位域的特殊性,开发人员常常会遇到一些问题。开发人员应该注意位域的宽度、字节对齐、位序、符号扩展、运算等问题,并在跨平台开发时谨慎使用位域,以确保代码的正确性和可移植性。位域的使用会增加代码的复杂性,降低可读性。由于不同的编译器对位域的实现方式可能有所不同,因此位域的可移植性可能受到影响。在跨平台开发时,需要谨慎使用位域,确保代码在不同的编译器上能够正确编译和运行。问题:位域的可读性问题。

CfgTf__的博客 154

Linux 系统编程 —— C结构体之位域(位段)

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

u011285208的博客 3167

微带功分器设计与ADS-EM联合仿真实战解析

本文详细解析了微带功分器设计与ADS-EM联合仿真的实战技巧,涵盖特性阻抗计算、ADS原理图设计、版图生成与EM仿真等关键步骤。通过实际案例分享,帮助工程师掌握射频电路设计中的核心技术和调试方法,提升功分器设计效率与性能。

weixin_29280219的博客 451

linux 之C语言结构体冒号数据类型——位域

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

clam_zxf的博客 567

手把手教你用Zemax优化MTF:从‘离焦平衡球差’到高频像差控制的实战技巧

本文详细介绍了如何使用Zemax优化MTF性能,从基础设置到高级技巧的全流程。通过具体案例,讲解了如何利用离焦平衡球差提升中频MTF,以及识别和控制高频像差的方法,帮助光学设计工程师和学生有效提升成像质量。

weixin_30752699的博客 751

pytorch gpu运行安装重点(CUDA12.3)

pytorch gpu加速

weixin_45597212的博客 3万+

linux python ctypes,Python ctypes位域Windows与Linux

我遇到了一个依赖于操作系统的问题,在pythonctype中定义了一个相对简单的位字段。位域在Windows7x64下运行良好,但在Ubuntu12.04x64中却失败了。两个操作系统都使用python2.7解释器。在附加代码突出了我的问题。如果我的位域是用c\u uint定义的,它在Ubuntu中就失败了。如果我把它换成了库乌肖特,它会像预期的那样工作。Windows似乎可以使用这两种定义。在在...

weixin_31995343的博客 545

AI 编程工具面试题(Claude Code、Codex 等)基础篇(一)

文章摘要: 本文整理了20道AI编程工具基础面试题,涵盖Claude Code、Codex CLI、GitHub Copilot等主流工具的核心概念与实操技巧。内容分为工具分类(代码补全/对话式/自主代理)、安装配置(静默部署/API管理)、关键命令(上下文加载/token监控)、调试策略(错误处理/提示优化)及对比选型(Tabnine vs Copilot)。重点解析了终端工具与模型能力的差异,并针对实际场景(如长代码生成/私有化部署)提供解决方案。附追问环节,深入探讨工具边界问题(如上下文溢出处理)和成

篮球界最会写bug的人;程序猿中打球最菜的人。 338

关于结构体的位域

说到位域,不得不说这是一个很有意思的东西,我平时用得不太多, 因为这个东西在我的印象里是对内存抠到极致迫不得已才会使用它的。 一般情况下我使用的硬件环境都还比较资源够用,所以就不怎么用, 但是既然提到了,也就写一篇关于位域的文, 大概从以下几个方面来说, 一、基本形式: 位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名: 位域长度 例如: typedef struct bs { unsigned

Tianqf505的博客 5769

AUTOSAR模式管理-EcuM多核处理及其他概念

因此,EcuM不请求状态。因此,BswM必须确保,例如,在调用EcuM_GoHalt或EcuM_GoPoll之前,必须将关机目标从其默认值更改为ECUM_STATE_SLEEP。对于ECU的关闭,BswM(位于主EcuM的同一个分区中)最终调用主核上的GoOff,该GoOff将请求分发给所有的从核。在ECU Manager模块的早期版本中,睡眠目标被特殊处理,因为在ECU中实现的睡眠模式取决于ECU的功能。在使用了外部的SBC控制相关的MCU的下电的时候,在OFF阶段最后调用SBC进入到Sleep的指令。

m0_49148264的博客 1340

涨点神器:基于YOLOv8的SPD-Conv小目标检测实战教程——让低分辨率场景检测精度飙升

从代码修改到场景落地,每一步都围绕“提升检测精度”这个核心目标,而实际数据也证明了这项技术的强悍——它不是实验室里的花拳绣腿,而是能真正解决工业痛点的涨点神器。在实际场景中,比如无人机巡检的低分辨率航拍图中,对电线、小设备的检测,YOLOv8-SPD的漏检率降低了70%以上。落地时,只需将训练好的YOLOv8-SPD模型部署到边缘设备或云端,即可享受其在小目标、低分辨率场景下的强大性能。的特征融合模块中,通过插入SPD-Conv,让模型在处理小目标时,既能保留空间细节,又能增强通道维度的特征表达。

m0_71589036的博客 157

位域最详细的剖析

位域的剖析1.定义2.性质3.例子4.无名位域5.实现6.含位域结构体的sizeof7.位域的压缩(SIZEOF)7.1.位域类型相同7.2.位域类型不同7.3.赋值方式,排列方式8.总结 1.定义 位域,又称位段。C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用0或1表示,只需1位即可。在计算

qq_46359697的博客 6423

CGAL 网格等高线计算

CGAL 网格等高线计算

dayuhaitang1的博客 452

C语言位域

位域定义与结构定义相仿,其形式为:struct 位域结构名位域列表其中位域列表的形式为:元素描述type只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。位域的名称。width位域中位的数量。宽度必须小于或等于指定类型的位宽度。带有预定义宽度的变量被称为位域。位域可以存储多于 1 位的数,例如,需要一个变量来存储从 0 到 7 的值,您可以定义一个宽度为 3 位的位域,如下:} Age;

m0_65541699的博客 1953

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C语言 位域

struct 位域结构名 {位域列表 };元素描述type只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。位域的名称。width位域中位的数量。宽度必须小于或等于指定类型的位宽度。带有预定义宽度的变量被称为位域。上面的结构定义指示 C 编译器,age 变量将只使用 3 位来存储这个值,如果您试图使用超过 3 位,则无法完成。

学习日常分享 2131

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

位域详解

本文转自:https://blog.youkuaiyun.com/lzeleven/article/details/70304445 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域...

Primeprime的专栏 2336

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于位域

      今天看了林锐写的《高质量程序指南》的第九章关于位域的介绍,说不是很清楚,便上百度百度了一下。为养成随时记录的好习惯,转载此文。位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间

nicemary的专栏 542
上一篇: 老码农教你学英语
下一篇: 字节那些事儿
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值