一、通過sbit或者bit定義
sbit對映到io口(p1^1這種io口的「位」)
bit在ram中的可位定址空間中,一般用作程式判斷的標誌位。
認為它們乙個對外(sbit),乙個對內(bit)。
二、通過位域(結構體中)定義
位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
; 其中位域列表的形式為: 型別說明符 位網域名稱:位域長度
例如:
struct bs
; 位域變數的說明與結構變數說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
data;
說明data為bs變數,共佔兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:
1. 乙個位域必須儲存在同乙個位元組中,不能跨兩個位元組。如乙個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
在這個位域定義中,a佔第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,占用4位,c占用4位。
2. 由於位域不允許跨兩個位元組,因此位域的長度不能大於乙個位元組的長度,也就是說不能超過8位二進位。
3. 位域可以無位網域名稱,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
; 從以上分析可以看出,位域在本質上就是一種結構型別, 不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為: 位域變數名•位網域名稱 位域允許用各種格式輸出。
main() bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
} 上例程式中定義了位域結構bs,三個位域為a,b,c。說明了bs型別的變數bit和指向bs型別的指標變數pbit。這表示位域也是可以使用指標的。
程式的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許範圍)程式第12行以整型量格式輸出三個域的內容。第13行把位域變數bit的位址送給指標變數pbit。第14行用指標方式給位域a重新賦值,賦為0。第15行使用了復合的位運算子"&=", 該行相當於: pbit->b=pbit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進位制值為3)。同樣,程式第16行中使用了復合位運算"|=", 相當於: pbit->c=pbit->c|1其結果為15。程式第17行用指標方式輸出了這三個域的值。
使用位域的主要目的是壓縮儲存,其大致規則為:
1) 如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;
2) 如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;
3) 如果位域字段之間穿插著非位域字段,則不進行壓縮;
4) 整個結構體的總大小為最寬基本型別成員大小的整數倍。
三、通過通過組合 位運算子 來操作
#define setbit(x,y) (x|=(0x01<
#define clrbit(x,y) (x&=(~(0x01<
#define chkbit(x,y) (x&(0x01<
C語言中的字元型陣列
本篇部落格的 是在vc6.0 中實現 一看部落格標題好像是在說字元陣列的,實際上在c語言中,字元型陣列包括字元陣列和字串陣列 陣列知識並不是很難的知識,但是一些細節問題需要注意,繁瑣的概念問題不在過於強調,只強調一些易錯易忽視的一些問題 字元陣列 概念 顯然是由一些字元組成的陣列 例如 定義乙個字元...
c 語言中的巨集定義
巨集定義 巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括 巨集定義 檔案包含 條件編譯 1.不帶引數的巨集定義 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的 符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨...
C語言中矩陣定義問題
c語言在進行矩陣運算的時候可以按照下邊來定義 typedef struct matrix matrix 向量可以定義成下式 typedef struct vector vector 這樣可以包括所有維數的向量和矩陣。要在初始化的時候給矩陣和向量申請空間,不然為空會報錯,在申請空間時定義函式 void...