这个取决于编译器,编译器依赖于操作系统,操作系统依赖于硬件,根上还是有CPU读写数据的机器字长和地址总线来决定 的。。没有那么多限制的,举个例子, 我们随便定义一个位段,只有一个数据成员,占2个二进制位。 sizeof 的大小依然是4,如下代码:
#include <stdio.h>struct bit_record {
unsigned int x : 2
}br
int main()
{
printf("%d\t%d\n" ,sizeof (bit_record), sizeof (br))
return 0
}
事实上你把它当成一个struct结构体就好了,不用太较真。。比如你在编写IEEE754浮点数编码的时候,经常用到位域,它的结构如下代码所示:
typedef struct FP_SINGLE{
unsigned __int32 fraction : 23 //这里也早超过一个字节。。
unsigned __int32 exp : 8
unsigned __int32 sign : 1
} fp_single
typedef struct FP_DOUBLE
{
unsigned __int64 fraction : 52 //这里早超过int类型的,需要用扩展int类型
unsigned __int64 exp : 11
unsigned __int64 sign : 1
} fp_double
位段(bit-field)是以位为单位来定义结构体(或联合体)中的成员变量所占的空间。含有位段的结构体(联合体)称为位段结构。采用位段结构既能够节省空间,又方便于操作。
位段的定义格式为:
type [var]: digits
其中type只能为int,unsigned int,signed int三种类型(int型能不能表示负数视编译器而定)。位段名称var是可选参数,即可以省略。digits表示该位段所占的二进制位数。
那么定义一个位段结构可以像下面这段代码去定义:
struct node{
unsigned int a:4 //位段a,占4位
unsigned int :0 //无名位段,占0位
unsigned int b:4 //位段b,占4位
int c:32 //位段c,占32位
int :6 //无名位段,占6位
}
使用位段需注意一下几点:
1)位段的类型只能是int,unsigned int,signed int三种类型,不能是char型或者浮点型;
2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,比如在VC中int是占4个字节,那么最多只能是32位;
3)无名位段不能被访问,但是会占据空间;
4)不能对位段进行取地址操作;
5)若位段占的二进制位数为0,则这个位段必须是无名位段,下一个位段从下一个位段存储单元(这里的位段存储单元经测试在VC环境下是4个字节)开始存放;
6)若位段出现在表达式中,则会自动进行整型升级,自动转换为int型或者unsigned int。
7)对位段赋值时,最好不要超过位段所能表示的最大范围,否则可能会造成意想不到的结果。
8)位段不能出现数组的形式。