C语言位段的讲解超详细

 2023-03-02 08:09:28  阅读 0

一、位段的概念

位段的定义与结构体的定义相仿;格式如下:

struct 位段结构名
  {
    类型说明符1 位段名1:位段长度1; //最低位;
    类型说明符2 位段名2:位段长度2; //次低位;
    类型说明符3 位段名3:位段长度3;
      ......
    类型说明符N 位段名N:位段长度M; //最高位;
  };

位段变量的说明与结构体变量的说明方式相同;可采用两种方式:

先定义后说明、同时定义说明;

位段变量的使用与结构体变量的使用方法相同,有两种形式:

变量:  位段变量名.位段名

指针:  位段指针名->位段名

二、位段的存储规则

(1) 如果相邻的两个位段字段的类型相同,且其位宽之和小于其类型的sizeof()大小,则其后面的位段字段将紧邻前一个字段存储,直到不能容纳为止;

(2) 如果相邻的两个位段字段的类型相同,且其位宽之和大于其类型的sizeof()大小,则后面的位段字段将从下一个存储单元的起始地址处开始存放,其偏移量恰好为其类型的sizeof()大小的整数倍;

(3) 如果相邻的两个位段字段的类型不同,则各个编译器的具体实现有差异,VC6采取不压缩方式,GCC和Dev-C++都采用压缩方式;

(4) 如果位段字段之间穿插着非位段字段,则不进行压缩;

(5)整个位段结构体的大小为其最宽基本类型成员大小的整数倍;

(6) 位段字段在内存中的位置是按照从低位向高位的顺序放置的;

(7) 取地址操作符&不能应用在位段字段上;

接下来我们做一道题以便于理解:编写程序输出各个位段的值。

//FileName: chap10_11.c
#include<stdio.h>
int main()
{
  struct cbit
  {
   unsigned a:1;
   unsigned b:3;
   unsigned c:4;
  } bit, *pbit;
  bit.a = 1;
  bit.b = 7;
  bit.c = 15;
  printf("%d,%d,%d\n", bit.a, bit.b, bit.c);
  pbit = &bit;

pbit -> a = 0;
	pbit -> b &= 3;
	pbit -> c |= 1;
	printf("%d,%d,%d\n", pbit -> a, pbit -> b, pbit -> c);
	return 0;
}

 程序运行结果如下:

1,7,15

0,3,15

标签:

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码