C/C++提供了一个内嵌的特征来访问字节中的为,即位域。位域很有用,因为:
1)如果存储空间受限,可以在一个字节中存储多个布尔变量(真/假)。
2)某些设备传输被编码为一个字节中的为的状态信息。
3) 某些加密程序需要访问字节中的位。
C/C++使用基于结构的方法来访问位。事实上,位域是结构成员的特殊类型,它以位(bit)为单位定义域的长度。
位域定义的一般形式如下(C++风格)
struct struct-type-name
{
type name1:length;
type name2:length;
....
type nameN:length;
} variable_list;
type是位域的类型,应该是_Bool(C99)、char、int和枚举等整型类型。
length是位域的长度,要求是非负整型常量或表达式,并且值不能大于type所对应的位宽度。例如,char bit_field:9是无法通过编译的。
另外,长度为1的位域应该声明为unsigned,因为单个位不能有符号。
给位域赋值与给其他任何类型的结构成员赋值一样。
位域并不一定要命名,这样可以跳过无用位,方便的使用希望的位。
位域变量的使用有一些限制:
1).不能使用位域变量的地址。
2).位域变量不能构成数组。
3).位域变量不能声明为静态的。
特别的,位域的使用与机器的比特序有关。
关于比特序和字节序之间的区别和联系,可以参考下文:
http://www.linuxjournal.com/article/6788
我的blog上有该文的翻译版,不过本人乃业余翻译者,不对翻译内容和质量作任何承诺和保证。
http://blog.csdn.net/lovekatherine/archive/2007/04/14/1564731.aspx
后文重点分析位域与比特序的关系,以下面的小程序为例。
1)如果存储空间受限,可以在一个字节中存储多个布尔变量(真/假)。
2)某些设备传输被编码为一个字节中的为的状态信息。
3) 某些加密程序需要访问字节中的位。
C/C++使用基于结构的方法来访问位。事实上,位域是结构成员的特殊类型,它以位(bit)为单位定义域的长度。
位域定义的一般形式如下(C++风格)
struct struct-type-name
{
type name1:length;
type name2:length;
....
type nameN:length;
} variable_list;
type是位域的类型,应该是_Bool(C99)、char、int和枚举等整型类型。
length是位域的长度,要求是非负整型常量或表达式,并且值不能大于type所对应的位宽度。例如,char bit_field:9是无法通过编译的。
另外,长度为1的位域应该声明为unsigned,因为单个位不能有符号。
给位域赋值与给其他任何类型的结构成员赋值一样。
位域并不一定要命名,这样可以跳过无用位,方便的使用希望的位。
位域变量的使用有一些限制:
1).不能使用位域变量的地址。
2).位域变量不能构成数组。
3).位域变量不能声明为静态的。
特别的,位域的使用与机器的比特序有关。
关于比特序和字节序之间的区别和联系,可以参考下文:
http://www.linuxjournal.com/article/6788
我的blog上有该文的翻译版,不过本人乃业余翻译者,不对翻译内容和质量作任何承诺和保证。
http://blog.csdn.net/lovekatherine/archive/2007/04/14/1564731.aspx
后文重点分析位域与比特序的关系,以下面的小程序为例。
#include <stdio.h>
#include <string.h>
typedef struct _bitdomain
{
unsigned char a:3;
unsigned char b:5;
} X;
void display (char dst)
{
int i;
unsigned int m=128;
while(m)
{
#include <string.h>
typedef struct _bitdomain
{
unsigned char a:3;
unsigned char b:5;
} X;
void display (char dst)
{
int i;
unsigned int m=128;
while(m)
{