c++这些结构体是什么意思?

在大多数情况下,我们一般这样定义结构体:

对于一般的应用,这已经能很充分地实现数据了的“封装”。

但是,在实际工程中,往往碰到这样的情况:那就是要用一个基本类型变量中的不同的位表示不同的含义。譬如一个cpu内部的标志寄存器,假设为16

bit,而每个bit都可以表达不同的含义,有的表示结果是否为0,有的表示是否越界等等。这个时候我们用什么数据结构来表达这个寄存器呢?

为达到此目的,我们要用到结构体的高级特性,那就是在基本成员变量的后面添加:

成员1类型成员1 : 成员1位数;

成员2类型成员2 : 成员2位数;

成员3类型成员3 : 成员3位数;

基本的成员变量就会被拆分!这个语法在初级编程中很少用到,但是在高级程序设计中不断地被用到!

基本成员变量被拆分后,访问的方法仍然和访问没有拆分的情况是一样的,例如:

虽然拆分基本成员变量在语法上是得到支持的,但是并不等于我们想怎么分就怎么分,例如下面的拆分显然是不合理的:

这是因为1+12 = 13,不能再组合成一个基本成员,不能组合成char、int或任何类型,这显然是不能“自圆其说”的。

在拆分基本成员变量的情况下,我们要特别注意数据的存放顺序,这还与CPU是Big endian还是Little

endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little

endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。

我们定义IP包头结构体为:

若在Big endian模式下还这样定义,则存放方式为:

这与实际的IP协议是不匹配的,所以在Linux内核源代码中,IP包头结构体的定义利用了宏:

来区分两种不同的情况。

由此我们总结全文的主要观点:

(1) C/C++语言的结构体支持对其中的基本成员变量按位拆分;

(2) 拆分的位数应该是合乎逻辑的,应仍然可以组合为基本成员变量;

要特别注意拆分后的数据的存放顺序,这一点要结合具体的CPU的结构。

= 100, 最高1为表示c为负数,负数在计算机用补码表示,所以c = -4;同理 b = -1;当c为有符合数时, c =

在拆分基本成员变量的情况下,我们要特别注意数据的存放顺序,这还与CPU是Big endian还是Little

endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little

endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,

用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。

这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:

struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符

位域变量的说明与结构变量说明的方式相同。

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

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

由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。

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

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

 C++ 中类和结构体的唯一区别在于:结构体在默认情况下成员是公共的(public),类在默认情况下成员是私有的(private)。其他的都一样,类有的结构体也有.

给主人留下些什么吧!~~

感谢所有关心和支持过ChinaUnix的朋友们

Word16是一个结构体,可以用于存储双字节数据或者变量,结构内部包含了

我要回帖

更多关于 结构体标识符和结构名啥区别 的文章

 

随机推荐