ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

新叶集1

新叶集1

新叶集1

汇总了《C语言程序设计》中(对笔者而言的)新知识。

一、结构体位段

掌握:结构体位段的特性、定义含位段的结构体变量、赋值和使用位段成员。

特性

一般而言,数据存取都是以字节(Byte : 1 Byte = 8 bits)为单位的。但有时存储一个数据仅需若干个二进制位(bit)即可,从而节省存储空间

定义

struct packed_data
{unsigned short a:2;	//指定成员a占2位unsigned short b:6;	//指定成员b占6位unsigned short c:5;	//指定成员c占5位unsigned short d:3;	//指定成员d占3位short int i;	//指定成员i为短整型,占16位
}data;	//定义结构体类型变量data

变量data的内存分配如图1,共占4字节。

位段的存取方法与结构体成员的存取方法相同。

若有:data.a = 2 , data.b = 37 , data.c = 28 , data.d = 6 , data.i = 300 ,则内存数据图如图2。

赋值

给位段成员赋值时,应注意成员的取值范围,取值范围由位段占几位决定。

注意事项

(1)一个位段的长度不能超过一个存储单元(8位)。

(2)一个位段不能跨越两个存储单元。若当前存储单元剩余的二进制位数小于位段长度,则剩余的二进制位不用,系统自动到下一个存储单元为该位段分配空间(不够用,跳下一个)。

(3)不想用的二进制位可以定义为无名位段,例如

struct packed_data
{unsigned short a:2;unsigned short :6;	//无名位段,占6位,不用unsigned short c:5;unsigned short d:3;short int i;
}data;

(4)设置长度为0的位段,使得下一个位段从下一字节开始存放,例如

struct packed_data
{unsigned short a:2;unsigned short b:0;	//位段长度为0unsigned short c:5;	//位段c从下一字节开始存放unsigned short d:3;short int i;
}data;

(5)位段成员的类型必须指定无符号整型

(6)位段数据可以按整型数据引用和输出。

(7)不能定义位段数组。

实例

由此可见,分析结构体位段,首先要计算结构体变量所占空间,再根据结构体成员所占空间和赋的值,画出内存数据图。

若需将整个结构体变量按十六进制输出,则可把内存数据图每四位一分段,每段对应一个十进制数。

二、共用体类型

三、枚举类型

四、文件系统

返回列表