日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

新唐c语言怎么计算指数运算,C语言位域精解

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新唐c语言怎么计算指数运算,C语言位域精解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域,并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。

一、位域的定義和位域變量的說明

位域定義與結構定義相仿,其形式為:

struct 位域結構名

{ 位域列表 };

其中位域列表的形式為: 類型說明符 位域名:位域長度

例如:

struct bs

{

int a:8;

int b:2;

int c:6;

};

位域變量的說明與結構變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如:

struct bs

{

int a:8;

int b:2;

int c:6;

}data;

說明data為bs變量,共占兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點說明:

1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。

例如:

struct bs

{

unsigned a:4;

unsigned :0;

unsigned b:4;

unsigned c:4;

}

在這個位域定義中,a占第一字節的4位,后4位填0表示不使用,b從第二字節開始,占用

4位,c占用4位。

2. 由于位域不允許跨兩個字節,因此位域的長度不能大于一個字節的長度,也就是說不能超過8位二進位。

3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

struct k

{

int a:1;

int :2;

int b:3;

int c:2;

};

從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。

二、位域的使用

位域的使用和結構成員的使用相同,其一般形式為:

位域變量名·位域名

位域允許用各種格式輸出。

main(){

struct bs

{

unsigned a:1;

unsigned b:3;

unsigned c:4;

} 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行中使用了復合位運算"|=".之所以要有透析基礎知識這么個分欄,就是告訴大家重 在細節的道理,粗略的東西誰都懂,修煉內功為高手的必經之路.

前面的內容存在缺陷,具體還要參考如下文章:

C99規定int、unsignedint和bool可以作為位域類型,但編譯器幾乎都對此作了擴展,允許其它類型類型的存在。

使用位域的主要目的是壓縮存儲,其大致規則為:

1) 如果相鄰位域字段的類型相同,且其位寬之和小于類型的sizeof大小,則后面的字

段將緊鄰前一個字段存儲,直到不能容納為止;

2) 如果相鄰位域字段的類型相同,但其位寬之和大于類型的sizeof大小,則后面的字

段將從新的存儲單元開始,其偏移量為其類型大小的整數倍;

3) 如果相鄰的位域字段的類型不同,則各編譯器的具體實現有差異,VC6采取不壓縮方

式,Dev-C++采取壓縮方式;

4) 如果位域字段之間穿插著非位域字段,則不進行壓縮;

5) 整個結構體的總大小為最寬基本類型成員大小的整數倍。

typedef struct&nBSP;?AA

{

unsigned char b1:5;

unsigned char b2:5;

unsigned char b3:5;

unsigned char b4:5;

unsigned char b5:5;

}AA;

sizeof(AA) = 5; 但實際上只用了25位,即4個字節,

(1)typedef struct??AA

{

unsigned int b1:5;

unsigned int b2:5;

unsigned int b3:5;

unsigned int b4:5;

unsigned int b5:5;

}AA;

(2)typedef struct??AA

{

unsigned int b1:5;

unsigned int b2:5;

unsigned int b3:5;

unsigned int b4:5;

unsigned int b5:5;

unsigned int b6:5;

unsigned int b7:5;

}AA;

(1)是5個成員,按第一條規則,共占25位,按第五條規則,即sizeof(AA)=4

現把成員加到7個,參考(2),按第一條規則,共占35位,按第五條規則,即sizeof(AA)=8,

nullem;text-align:left">再看一個例子:

struct test1

{

char a:1;

char :2;

long b:3;

char c:2;

};

int len = sizeof(test1);

對于上述例子,len的值應該是12.解釋如下:

首先以最長的類型位寬做為偏移量,最長的是long型,占4位,所以不同類型之間應該是4個字節的偏移,即test1應該是4字節的整數倍。

char a:1; //用一個字節去存儲

char :2;  //空域。因為與前面的a的類型相同,而兩個位域的位寬相加仍然少于8位,所以依然用1個字節表示

long b:3; //long類型的位寬是4個字節,與前面的char類型不同,所以b與a之間偏移4個字節,它們之間自動補充3個字節

char c:2; //因為c與b又不同型,以test1中的最長的long類型的位寬進行偏移,所以雖然char只用1個字節就夠了

//但依然要占4個字節。

總共是12字節。

///

struct s1

{

int i: 8;

int j: 4;

int a: 3;

double b;

};

struct s2

{

int i: 8;

int j: 4;

double b;

int a:3;

};

printf("sizeof(s1)= %d\n", sizeof(s1));

printf("sizeof(s2)= %d\n", sizeof(s2));

result: 16, 24

第一個struct s1

{

int i: 8;

int j: 4;

int a: 3;

double b;

};理論上是這樣的,首先是i在相對0的位置,占8位一個字節,然后,j就在相對一個字節的位置,由于一個位置的字節數是4位的倍數,因此不用對齊,就放 在那里了,然后是a,要在3位的倍數關系的位置上,因此要移一位,在15位的位置上放下,目前總共是18位,折算過來是2字節2位的樣子,由于 double是8 字節的,因此要在相對0要是8個字節的位置上放下,因此從18位開始到8個字節之間的位置被忽略,直接放在8字節的位置了,因此,總共是16字節。

總結

以上是生活随笔為你收集整理的新唐c语言怎么计算指数运算,C语言位域精解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。