C语言中位域操作

C语言中位域定义: 以结构体中定义申明变量的形式: 类型说明符 位域名:位域宽度
struct bit{
int a:4; // 申明位域变量a,占用4个bit位宽度
int b:4; // 申明位域变量b,占用4个bit位宽度
int c:4; // 申明位域变量c,占用4个bit位宽度
};

在gcc编译器中对结构体进行了默认的对齐操作,以下的所有的现象都是基于gcc的编译条

件:
1):申明的两个相连的位域变量占位一般都是紧密连接的,例如上面的a和b,或者是b和

c:a占用起始字节的低4位,b占用起始字节的高4位,而c占用的是第二个字节的低4位,

依次紧密相连。

2):如果一个位域变量的占位数不超过1个字节,那么这个变量的占位分配是不会横跨两

个字节的,也就是说他必须在一个字节内,例如上面的b如果占位为5的话,如果直接按1

)说的那样他的占位分配就会横跨不同的字节,这种情况下应该从下一个字节开始分配;

如果位域变量的占位数超过了一个字节,那么占位分配不能直接在前一个变量后面接续,

而应从下一个字节开始占位;因此这段话的意思就是:如果一个位域变量的占位数超过了

上一个位域变量占位之后剩余的bit位(我说的是一个字节内的剩余),那么这个位域变

量应该从下一个"干净"的字节开始占位。所以我在 1) 中说的是一般。

3):整个结构体大小的确定方法:
实际上,整个结构体大小,并不是内部占了多少个bit位这个简单,本身编译器就会进行

一个字节对齐的操作,其次和普通的结构体字节对齐方式又大有不同:
如果我们连续申明的几个位域变量占位之和只要不超过这些变量中类型大小最大的那个类

型的大小,那么这些连续申明的变量总的大小就是这个类型的大小,例如:
struct bit{
int a:4;
int b:4;
char c:4;
char d:4;
}
根据上面的方法,这几个变量中类型最长就是int,而他们的bit位长度相加并不会超过

int类型的长度,所以这个结构体的大小就是4字节。如果超过了,例如下面这种情况:
struct bit{
int a:8;
int b:8;
int c:8;
char d:8;

char e:3;
};
那么这种情况就是: 前面的4个变量占位刚好就是int的大小,分为一组,而后面的e又

单独分为一组,也是按照上面的方法来确定这组的大小,这组中最大的类型就是char,而

e没有超过char的大小,所以就是1个字节,所以整个结构体的大小就是 4+1 = 5个字节。

3):我们可以在结构体中申明一个没有位域名的变量,例如:
struct bit{
int a:4;
int b:4;
int :0;
int :2;
};
那么此时这个没有名字的位域变量是不能被使用的,他只是被用来占位而已,如果是 占

位为0的无名位域变量,例如第3项,int :0,虽然也是占位,但是稍稍要复杂许多:
这个变量意思就是从一个新的字节开始分配新的变量,但是这个具体的新的字节是那个字

节,并不一定就是下一个字节,是跟具体的类型修饰符有关,如果是char修饰,那么就是

从下一个字节开始,看例子吧,我都不知道怎么表达了。
struct bit{
int a:8;
int b:8;
int :0; // 从a的起始开始数4个字节之后开始占位
};

struct bit{
int a:8;
int b:8;
char :0; // 从b的起始开始数1个字节之后开始占位
};

struct bit{
int a:8;
int b:8;
int c:8;
short :0; // 从b的起始开始数2个字节之后开始占位
};

struct bit{
int a:8;
int b:8;
int c:8;
int d:8;
int :0; // 从a的起始开始数4个字节之后开始占位
};

struct bit{
int a:8;
int b:8;
int c:8;
int d:8;

int e:8;
int :0; // 从e的起始开始数4个字节之后开始占位,因为此时前面4个已经成一组


};

struct bit{
int a:8;
int b:8;
int c:8;
int d:8;

int e:8;
short :0; // 从e的起始开始数2个字节之后开始占位,因为此时前面4个已经成一

组了
};

struct bit{
int a:8;
int b:8;
int c:8;
int d:8;

int e:8;
char :0; // 从e的起始开始数1个字节之后开始占位,因为此时前面4个已经成一

组了
};

一定要注意了:空开的空间也算是这个结构体的空间。

时间: 2024-12-29 09:15:21

C语言中位域操作的相关文章

015_C语言中文件操作

 文件:存储在外部介质上的数据集合 ASCII码文件和二进制文件 流式文件和非流式文件 在内存中只有1和0,电脑在显示文件时,按一定编码显示 流式文件:输入输出的数据流的开始和结束仅受程序控制而不受物理符号控制 缓冲文件和非缓冲文件 每一个使用的文件都会在内存中开辟一个缓冲区 文件打开fopen 文件关闭fclose 读到文件末尾时即读到EOF 文件操作所用到的函数fgetc/fputc  fgets/fputs   fscanf/fprintf等一些函数使用时可同过帮助文档得知 文件定位函

c语言中字符串操作的工具类

 1.编写头文件 #define _CRT_SECURE_NO_WARNINGS //#pragmawarning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> struct CString { char *p;        //保存字符串首地址 int reallength; //实际长度 }; typedef struct CString mystring;//

字符数组在C++、C#等语言中的操作

1,C++中操作数组 #include <iostream> using namespace std; int length(char []); void output_frequency(char []); int main() { char str[]="yan cong min"; cout<<"要处理的字符串为:"<<str<<endl; cout<<"字符串长度为:"<&

【C】C语言中文件操作相关内容

1. 文件和流的关系 C将每个文件简单地作为顺序字节流.每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件的关系. 在开始执行程序的时候,将自动打开3个文件和相关的流:标准输入流.标准输出流和标准错误.流提供了文件和程序的通信通道.打开一个文件将返回指向FILE结构(在stdio.h中定义)的指针,它包含用于处理文件的信息,也就是说,这个结构包含文件描述符.文件描述符是操作系统数组(打开文件列表的索引).每个数组

【转】c语言位域操作—_结构体内冒号:的使用

原文链接:http://blog.chinaunix.net/uid-22145625-id-1789513.html 这是C语言位域问题 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”.所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以

C语言中结构体的位域(bit-fields)

转自:http://blog.sina.com.cn/s/blog_6240b5980100tcba.html 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”.所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的

C语言中关于对目录的操作

原文地址:C语言中关于对目录的操作 目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,笔者主要是讨论在Linux平台下对目录的一系列操作: 1.获取当前目录操作: 在系统命令行下我们可以直接输入命令:pwd 来获取当前的工作目录,但是你知道这个命令是怎么执行的吗?它是由系统通过 Shell 程序来解释执行的,在我们自己编写程序的时候怎么能获取当前的工作目录呢?在标准C库中提供了一系列关于目录操作的接口函数: char * getcwd(char * buf,

c语言中文件相关操作

一 .首先介绍一下数据文件的类型: 1.二进制文件(映像文件):在内存中以二进制形式存取. 2.文本文件(ascii文件):以ascii码形式存取的文件. 通俗的讲,在Mac下,你把一个文件丢进记事本里面,如果打开是乱码就是二进制文件. 二.其次是文件类型指针: 简单的说文件类型指针就是存储文件信息的地址. 文件类型指针变量:定义一个指针类型的变量,用来指向存储文件信息的地址.用FILE定义.比如: FILE * fp 三.文件操作步骤(c语言中所有用到的函数都是f开头的.): 1.打开文件 f

C 语言中有趣第指针操作(转)

http://blog.csdn.net/ghevinn/article/details/37651149(反汇编题目需要分析) 4.取出内存区域的值 在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如: void main(){ int a[2] = {261,0}; int *pi = a; char *p = (char*)pi; cout << *(int *)p++ << endl;  //取出p