c语言位段

Python027

c语言位段,第1张

这个取决于编译器,编译器依赖于操作系统,操作系统依赖于硬件,根上还是有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)位段不能出现数组的形式。