C语言及应用第6章(阅读)
1. 位字段的定义 位字段类型定义的一般形式如下: struct 位字段类型名 { 数据类型名 位字段名1: 常量表达式1; 数据类型名 位字段名2: 常量表达式2; … 数据类型名 位字段名n: 常量表达式n; }; 其中,常量表达式用来指定每个位字段的宽度, 数据类型名指定每个位字段的数据类型,一般选用unsigned int,位字段类型名、 位字段名的构成应符合标识符的构成规则。 例如, 定义一个位字段类型如下: struct weiziduan { unsigned int w1:1; unsigned int w2:1; unsigned int w3:1; unsigned int w4:4; unsigned int w5:9; }; 以上定义了一个名为weiziduan的位字段结构类型, 它包含 5 个位字段成员,其数据类型均为无符号整数, 它们的宽度分别为 1、 1、 1、 4、 9 位, 如图 6-5 所示。 ? 图 6-5 位字段存储示意图 在进行位字段类型定义时应注意以下几点: (1) 当位字段结构中的各成员项的位数总和小于int类型的位长时,它仍将占用一个int类型的位长。 (2) 当位字段结构中的各成员项的位数总和超过int类型的位长时,将占用下一个连续的int位长。但是,一个位字段不能跨越两个int位长。 (3) 省略位字段名时,该段称为无名位字段,表示分配内存时将“跳过”该位字段所指定的位数。当无名位字段的宽度为 0 时,将强制下一个位字段从一个新的字节开始存放。 例如: struct zi { unsigned int z1:4; unsigned int :2; unsigned int z2:1; unsigned int :0; unsigned int z3:1; }; 其中,第一个无名位字段表示z1 与z2 之间空 2 位; 第二个无名位字段表示无论前一个字节是否还有剩余空间, z3 都将从下一个新字节开始存放, 如图 6-6 所示。 (4) 一个位字段的长度不能大于一个int位长, 也不能定义位字段数组。 图 6-6 位字段存储示意图 2. 位字段变量的说明 位字段变量的说明与结构变量的说明相同。 例如, struct weiziduan wz1,wz2; struct zi zd; 程序的运行结果如下: j的原值 =10,20 jg的原值 =10,20 jg的新值 =100,200 j的返回值=100,200 例 6.5 程序中,main()函数定义了一个结构变量j, 并作为实际参数调用函数f()。f()函数用具有相同结构的结构变量jg作为形式参数接收j传递的数据。 6.2 联 合 6.2.1 联合类型的定义和联合变量的说明 联合类型的定义和引用方式与结构类型非常相似。 1. 联合类型的定义 联合类型定义的一般形式如下: union 联合类型名 { 成员类型1 成员名1; 成员类型2 成员名2; … 成员类型n 成员名n; }; (1) union为联合类型定义的保留字必须原样照写。 (2) 联合类型名的构成应符合标识符的规定, 它与union一起构成特定的联合类型, 在以后的联合变量说明中可以被引用。 (3) 大括号内是由联合成员组成的联合体,每个成员由成员类型和成员名组成, 每个成员的数据类型可以是基本数据类型, 也可以是已定义过的结构类型和联合类型。 例如, 定义一个既能存储整型数据, 又能存储实型数据的联合类型, 定义形式如下: union lianhe { int i;