学点 C 语言(27): 数据类型 - 结构中的 "位字段"
2008-11-28 21:40
232 查看
所有基础的数据类型, 最大的也不过 10 个字节;
我们可以自定义的数据类型 -- "结构", 通过把若干类型组合在一起, 让一种类型可以大很多.
我们知道, 一个字节有八个 Bit 组成; 能否把一种类型缩小、缩小到 Bit 级?
结构中的 "位字段" 是以 Bit 为单位的, 这已经是计算机的最小单位, 大小是 char 类型的 1/8.
下面的例子中定义的位字段, 分别有 1-4 Bit 大小; 1 Bit 的字段只能放两个数(0、1), 4 Bit 的字段也只能放下 16 个数:
1. 结构体可以包含位字段:
上例中, 位域的类型被指定为是无符号的整型(unsigned int), 我试着只要是整型都可以, 但要一致.
假如我们定义 8 个字段, 每个字段都是 1 Bit, 就可以很好地明细一个字节, 譬如:
11111111B = 255;
00000001B = 1;
00001111B = 15;
01111111B = 127;
下面的例子用程序对上面的说明做了落实:
2. 用 8 个 Bit 构成一个 unsigned char 数:
3. 包含位字段的结构和其他结构没有区别, 譬如同时包含其他类型的字段:
我们可以自定义的数据类型 -- "结构", 通过把若干类型组合在一起, 让一种类型可以大很多.
我们知道, 一个字节有八个 Bit 组成; 能否把一种类型缩小、缩小到 Bit 级?
结构中的 "位字段" 是以 Bit 为单位的, 这已经是计算机的最小单位, 大小是 char 类型的 1/8.
下面的例子中定义的位字段, 分别有 1-4 Bit 大小; 1 Bit 的字段只能放两个数(0、1), 4 Bit 的字段也只能放下 16 个数:
1. 结构体可以包含位字段:
#include <stdio.h> int main(void) { struct Bit { unsigned a: 1; /* 1 Bit, 取值范围: 0 - 1 */ unsigned b: 2; /* 2 Bit, 取值范围: 0 - 3 */ unsigned c: 3; /* 3 Bit, 取值范围: 0 - 7 */ unsigned d: 4; /* 4 Bit, 取值范围: 0 - 15 */ } B; B.a = 1; B.b = 3; B.c = 7; B.d = 15; printf("%d, %d, %d, %d\n", B.a, B.b, B.c, B.d); getchar(); return 0; }
上例中, 位域的类型被指定为是无符号的整型(unsigned int), 我试着只要是整型都可以, 但要一致.
假如我们定义 8 个字段, 每个字段都是 1 Bit, 就可以很好地明细一个字节, 譬如:
11111111B = 255;
00000001B = 1;
00001111B = 15;
01111111B = 127;
下面的例子用程序对上面的说明做了落实:
2. 用 8 个 Bit 构成一个 unsigned char 数:
#include <stdio.h> int main(void) { struct Bit { int b8: 1; int b7: 1; int b6: 1; int b5: 1; int b4: 1; int b3: 1; int b2: 1; int b1: 1; } B; unsigned char *p = NULL; B.b1 = 1; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 255 */ B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 0; B.b6 = 0; B.b7 = 0; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 1 */ B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 15 */ B.b1 = 0; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 127 */ getchar(); return 0; }
3. 包含位字段的结构和其他结构没有区别, 譬如同时包含其他类型的字段:
#include <stdio.h> int main(void) { struct Bit { unsigned b1: 1; unsigned b2: 1; float f; } B; B.b1 = 0; B.b2 = 1; B.f = 3.14; printf("%d, %d, %g\n", B.b1, B.b2, B.f); getchar(); return 0; }
相关文章推荐
- 学点 C 语言(26): 数据类型 - 结构的更多可能
- R语言实战笔记--第二章 数据类型及结构
- 学点 C 语言(25): 数据类型 - 结构数组与结构指针
- 2012年1月3日 星期二(oracle读书笔记,PL/SQL语言概述、块结构、数据类型)
- C语言基础-数据类型提升的层次结构
- 语言基础(项目结构、数据类型、变量、常量)
- 语言基础(项目结构,数据类型,引用类型,转义字符,变量常量,基本的类型转换)
- 学点 C 语言(24): 数据类型 - 结构(struct)
- java语言操作Oracle数据库中的CLOB数据类型
- ANT无线通信技术(3) 数据类型及拓扑结构
- 我要从com向应用程序返回一个结构,结构中包括二进制数据,请问用什么方式传替比较好呢?BSTR,VARIANT还是其他什么类型比较好呢
- 30位有效数字的浮点数结构解决double数据类型多次累加后的明显的误差
- C#语言基础— 数据类型及其转换
- C语言教程第二章: 数据类型、运算符、表达式
- Go语言的类型结构
- java语言中的基本数据类型
- C语言控制输出不按数据类型输出的问题
- c语言基础:数据类型
- ——黑马程序员——C语言基础--数据类型
- 语言基础+数据类型