C- unsigned :1之位域分析

1.首先回憶結構體數據結構

咱們都知道定義一個結構體能夠這樣的方式定義:spa

struct Point { float x; float y; } point; //等價於: struct Point point;

除此以外,若是不想聲明結構體,只想定義結構體的話,還能夠這樣:3d

struct { float x; float y; } point; //等價於: struct Point point;

 

2.位域之簡單應用code

作低層時,常常會讀寫寄存器,好比操做某位,設置爲0或1,而在C語言中便爲咱們提供一種數據結構」位域」,使得咱們經過讀寫」位域」來實現操做某位.blog

例如一個常見的位域的結構體,操做以下所示:內存

#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.位域之越界處理it

好比,咱們定義的某個位域只有固定1位,若是向該位寫入超過1位的值.會自動保留最低1位.io

示例:編譯

#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字節),該如何使用位域處理?

方法1-使用union聯合體,使各字段共享一塊內存,經過讀寫union結構體裏的char變量便可.

示例:

#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;    reg.val=0; reg.bit.b = 1;            //bit[4]=1 printf("val = %d\n",reg.val); return 0; }

打印:

 

 方法2-直接定義爲unsigned char

示例:

struct reg{ unsigned char a:4; unsigned char b:2; unsigned char c:1; }; //位域總長度只有7位



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

打印:

 

6.若是想定義並初始化

示例:

typedef struct { unsigned OVL :6; unsigned OVOLCN :2; }rg11;
rg11 reg
= {57,1}; //初始化reg變量 OVL=57 OVOLCN=1
相關文章
相關標籤/搜索