# C- unsigned :1之位域分析

1.首先回忆结构体

```struct Point {
float x;
float y;
} point;                      //等价于: struct  Point  point;```

```struct  {
float x;
float y;
} point;                      //等价于:  struct  Point  point;```

2.位域之简单应用

```#include <stdio.h>

struct {
unsigned mode:8;          //bit[0,7]:模式选择
unsigned en:1;            //bit[8]   :使能选择
unsigned reserved:1;      //bit[9]    :保留reserved  (也可以写成unsigned reserved:1;)
unsigned clk_select:4;    //bit[10,13]:时钟选择
unsigned ch_select:3;     //bit[14,15]:通道选择
}reg11;            //定义一个reg11变量,不声明结构体的好处在于确保变量唯一性

int main()
{
reg11.en =1;                     //bit8=1 --> 256
printf("reg11=%d\n",reg11);         //打印 256

reg11.mode =50;
printf("reg11=%d\n",reg11);         //打印 256+50
return 0;
}```

3.位域之越界处理

```#include <stdio.h>
struct {
unsigned mode:8;          //bit[0,7]:模式选择
unsigned en:1;            //bit[8]   :使能选择
unsigned reserved:1;      //bit[9]    :保留reserved(也可以写成unsigned reserved:1;)
unsigned clk_select:4;    //bit[10,13]:时钟选择
unsigned ch_select:3;     //bit[14,15]:通道选择
}reg11;     //定义一个reg11变量,不声明结构体的好处在于确保变量唯一性

int main()
{
reg11.en =1;                     //bit8=1 --> 256
printf("1st:reg11=%d\n",reg11);  //打印 256

reg11.en =5;                     //5(b'101) 保留低1位: b'1
printf("2st:reg11=%d\n",reg11);  //打印 256

reg11.en =6;                     //5(b'110) 保留低1位: b'0
printf("3st:reg11=%d\n",reg11);  //打印 0

return 0;
}```

4.注意, 使用位域的结构体的长度默认最小值为int型(4字节),如果超过4字节(32位),则会是64位

```#include <stdio.h>

struct {
unsigned a:4;
unsigned b:2;
unsigned c:1;
}reg1;　　　　　　　　//位域总长度只有7位

struct reg{
unsigned a:4;
unsigned b:2;
unsigned c:32;
}reg2;

int main()
{
printf("%d\n",sizeof(reg1));
printf("%d\n",sizeof(reg2));
return 0;
}```

5.如果某个寄存器只有8位(1字节),该如何使用位域处理?

```#include <stdio.h>

typedef union{
unsigned char val;

struct {
unsigned a:4;
unsigned b:1;
unsigned c:2;
unsigned d:1;
}bit;

}reg11;             //使用typedef ,告诉编译器,reg11是个声明类型

int main()
{
reg11 reg;
printf("sizeof=%d\n",sizeof(reg.val));

reg.val=0;
reg.bit.b = 1;            //bit[4]=1
printf("val = %d\n",reg.val);

return 0;
}```

246 篇文章47 人订阅

0 条评论

## 相关文章

1233

3234

3456

3526

4515

2200

30910

### 如何在你的项目中使用JSR 303 - Bean Validation进行数值校验？

JSR-303 是 Java EE 6 中的一项子规范，叫做 Bean Validation，官方参考实现是hibernate Validator。

2114

### string 之 strrev函数

Author: bakari  Date: 2012/8/9 继上篇。。。。。 下面是我写的代码与源码作的一些比较，均已严格测试通过，分别以“string 之”...

1939

### PHP垃圾回收机制

1、每一个变量定义时都保存在一个叫zval的容器里面，这里面包含了数量的类型和和值，还包含了一个refcount（理解为存在几个变量个数）和is_ref（理解为...

45210