1、位 域 有 些 信 息 在 存 储 时 , 并 不 需 要 占 用 一 个 完 整 的 字 节 , 而 只 需 占 几 个 或 一 个 二 进 制 位 。例 如 在 存 放 一 个 开 关 量 时 , 只 有 0 和 1 两 种 状 态 , 用 一 位 二 进 位 即 可 。 为 了 节 省 存 储 空 间 ,并 使 处 理 简 便 , C语 言 又 提 供 了 一 种 数 据 结 构 , 称 为 “ 位 域 ” 或 “ 位 段 ” 。 所 谓 “ 位 域 ” 是把 一 个 字 节 中 的 二 进 位 划 分 为 几 个 不 同 的 区 域 , 并 说 明 每 个 区 域 的 位 数 。 每
2、个 域 有 一 个 域名 , 允 许 在 程 序 中 按 域 名 进 行 操 作 。 这 样 就 可 以 把 几 个 不 同 的 对 象 用 一 个 字 节 的 二 进 制 位域 来 表 示 。 一 、 位 域 的 定 义 和 位 域 变 量 的 说 明 位 域 定 义 与 结 构 定 义 相 仿 , 其 形 式 为 :struct 位 域 结 构 名 位 域 列 表 ;其 中 位 域 列 表 的 形 式 为 : 类 型 说 明 符 位 域 名 : 位 域 长 度例 如 :struct bs int a:8;int b:2;int c:6; 位 域 变 量 的 说 明 与 结 构 变 量 说
3、明 的 方 式 相 同 。 可 采 用 先 定 义 后 说 明 , 同 时 定 义 说 明 或者 直 接 说 明 这 三 种 方 式 。 例 如 :struct bs int a:8;int b:2;int c:6;data;说 明 data为 bs变 量 , 共 占 两 个 字 节 。 其 中 位 域 a 占 8 位 , 位 域 b 占 2 位 , 位 域 c 占6位 。 对 于 位 域 的 定 义 尚 有 以 下 几 点 说 明 :1. 一 个 位 域 必 须 存 储 在 同 一 个 字 节 中 , 不 能 跨 两 个 字 节 。 如 一 个 字 节 所 剩 空 间 不 够 存放 另 一
4、位 域 时 , 应 从 下 一 单 元 起 存 放 该 位 域 。 也 可 以 有 意 使 某 位 域 从 下 一 单 元 开 始 。 例 如 :struct bsunsigned a:4unsigned :0 /*空 域 */unsigned b:4 /*从 下 一 单 元 开 始 存 放 */unsigned c:4 在 这 个 位 域 定 义 中 , a 占 第 一 字 节 的 4 位 , 后 4 位 填 0表 示 不 使 用 , b 从 第 二 字 节 开 始 ,占 用 4位 , c 占 用 4位 。2. 由 于 位 域 不 允 许 跨 两 个 字 节 , 因 此 位 域 的 长 度
5、不 能 大 于 一 个 字 节 的 长 度 , 也 就 是 说不 能 超 过 8位 二 进 位 。3. 位 域 可 以 无 位 域 名 , 这 时 它 只 用 来 作 填 充 或 调 整 位 置 。 无 名 的 位 域 是 不 能 使 用 的 。例 如 :struct k int a:1int :2 /*该 2 位 不 能 使 用 */int b:3int c:2; 从 以 上 分 析 可 以 看 出 , 位 域 在 本 质 上 就 是 一 种 结 构 类 型 , 不 过 其 成 员 是 按 二 进 位 分 配的 。 二 、 位 域 的 使 用位 域 的 使 用 和 结 构 成 员 的 使 用
6、 相 同 , 其 一 般 形 式 为 : 位 域 变 量 名 位 域 名 位 域 允 许用 各 种 格 式 输 出 。main()struct bs unsigned a:1;unsigned b:3;unsigned c:4; bit,*pbit;bit.a=1;bit.b=7;bit.c=15;printf(“%d,%d,%dn“,bit.a,bit.b,bit.c);pbit=pbit-a=0;pbit-bpbit-c|=1;printf(“%d,%d,%dn“,pbit-a,pbit-b,pbit-c); 上 例 程 序 中 定 义 了 位 域 结 构 bs, 三 个 位 域 为 a,
7、b,c。 说 明 了 bs 类 型 的 变 量 bit和 指 向bs类 型 的 指 针 变 量 pbit。 这 表 示 位 域 也 是 可 以 使 用 指 针 的 。程 序 的 9、 10、 11 三 行 分 别 给 三 个 位 域 赋 值 。 ( 应 注 意 赋 值 不 能 超 过 该 位 域 的 允 许 范围 )程 序 第 12 行 以 整 型 量 格 式 输 出 三 个 域 的 内 容 。 第 13 行 把 位 域 变 量 bit 的 地 址 送 给 指 针变 量 pbit。 第 14 行 用 指 针 方 式 给 位 域 a 重 新 赋 值 , 赋 为 0。 第 15行 使 用 了 复
8、合 的 位 运 算 符“ 其 中 int是 整 型 变 量 的 类 型 说 明 符 。 int的 完 整 写法 为 integer,为 了 增 加 程 序 的 可 读 性 , 可 把 整 型 说 明 符 用 typedef 定 义 为 : typedef int INTEGER这 以 后 就 可 用 INTEGER来 代 替 int作 整 型 变 量 的 类 型 说 明 了 。 例 如 : INTEGER a,b;它 等 效于 : int a,b; 用 typedef定 义 数 组 、 指 针 、 结 构 等 类 型 将 带 来 很 大 的 方 便 , 不 仅 使 程 序 书写 简 单 而 且
9、 使 意 义 更 为 明 确 , 因 而 增 强 了 可 读 性 。 例 如 :typedef char NAME20; 表 示 NAME是 字 符 数 组 类 型 , 数 组 长 度 为 20。然 后 可 用 NAME 说 明 变 量 , 如 : NAME a1,a2,s1,s2;完 全 等 效 于 : char a120,a220,s120,s220又 如 :typedef struct stu char name20;int age;char sex; STU;定 义 STU 表 示 stu 的 结 构 类 型 , 然 后 可 用 STU 来 说 明 结 构 变 量 : STU body1,body2;typedef定 义 的 一 般 形 式 为 : typedef 原 类 型 名 新 类 型 名 其 中 原 类 型 名 中 含 有 定 义部 分 , 新 类 型 名 一 般 用 大 写 表 示 , 以 便 于 区 别 。 在 有 时 也 可 用 宏 定 义 来 代 替 typedef的 功能 , 但 是 宏 定 义 是 由 预 处 理 完 成 的 , 而 typedef则 是 在 编 译 时 完 成 的 , 后 者 更 为 灵 活 方 便 。