真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語(yǔ)言結(jié)構(gòu)體的位域是什么

本篇內(nèi)容主要講解“C語(yǔ)言結(jié)構(gòu)體的位域是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C語(yǔ)言結(jié)構(gòu)體的位域是什么”吧!

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括昌江黎族網(wǎng)站建設(shè)、昌江黎族網(wǎng)站制作、昌江黎族網(wǎng)頁(yè)制作以及昌江黎族網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,昌江黎族網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到昌江黎族省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

我們之前講結(jié)構(gòu)體的時(shí)候,都是用int,char之類(lèi)的數(shù)據(jù)類(lèi)型來(lái)定義結(jié)構(gòu)體的成員變量的,這些成員變量都有一個(gè)共性,就是他們的長(zhǎng)度都是一個(gè)字節(jié),或者一個(gè)的偶數(shù)倍。然而我們?cè)诖鎯?chǔ)某些信息時(shí),并不需要一個(gè)完整的,而是只需要讓這個(gè)變量占據(jù)一個(gè)或者幾個(gè)二進(jìn)制位。

可能有些讀者會(huì)想,那我直接使用一個(gè)字節(jié)的長(zhǎng)度來(lái)存儲(chǔ)這些幾位的變量即可,雖然會(huì)浪費(fèi)一些存儲(chǔ)空間,但是這些位的浪費(fèi)對(duì)于現(xiàn)在的一些計(jì)算機(jī)或者單片機(jī)來(lái)說(shuō)都是無(wú)關(guān)緊要的。確實(shí),當(dāng)我們定義一個(gè)變量的時(shí)候,對(duì)于目前計(jì)算機(jī)強(qiáng)大的硬件來(lái)說(shuō),定義以一個(gè)幾個(gè)位的變量和定義一個(gè)幾個(gè)字節(jié)的變量確實(shí)沒(méi)有任何影響,反而字節(jié)單位變量比位變量有更大的存儲(chǔ)空間,可以有效地防止長(zhǎng)度溢出。

但是,當(dāng)面對(duì)下面這種應(yīng)用時(shí),字節(jié)單位變量不僅沒(méi)有任何好處,反而會(huì)大大增加我們程序的操作難度。如,在一個(gè)單片機(jī)系統(tǒng)中有一個(gè)寄存器。假設(shè)這個(gè)寄存器的長(zhǎng)度為一個(gè)字節(jié),它的功能是用來(lái)控制一個(gè)單片機(jī)的定時(shí)器以及反應(yīng)一個(gè)定時(shí)器的狀態(tài),這個(gè)寄存器的第7,6位表示定時(shí)器的狀態(tài)位TIM_STAT[1:0],第5,4,3,2位表示定時(shí)器時(shí)鐘源的分頻系數(shù)TIM_DIV[3:0],第1位表示定時(shí)器的溢出標(biāo)志TIM_OVERFLOW,第0位表示定時(shí)器的工作開(kāi)關(guān)TIM_START/STOP。具體這個(gè)假設(shè)的寄存器如圖1所示。

C語(yǔ)言結(jié)構(gòu)體的位域是什么

圖1 某寄存器

面對(duì)上面的這種應(yīng)用,我們一般的做法就是定義一個(gè)unsigned char類(lèi)型的變量Tim_Ctrl,然后進(jìn)行位操作,比如要將TIM_STAT賦值狀態(tài)0b11,那我們就可以使用位操作語(yǔ)句,“Tim_Ctrl |= 0b11000000;”,如果要將TIM_STST賦值狀態(tài)0b00,就使用位操作語(yǔ)句“Tim_Ctrl &= ~(b11000000);”,這種微操作的方式非常繁瑣,而且直觀性很差。

那是否有一種數(shù)據(jù)類(lèi)型可以支持這種位數(shù)比較少的變量呢?比如直接可以定義一個(gè)兩位的變量,然后賦值狀態(tài)0b11即可。在C語(yǔ)言中,常規(guī)的變量明顯是不支持這種操作的,但是在結(jié)構(gòu)體中卻支持。這種C語(yǔ)言結(jié)構(gòu)體中支持位操作的方式被稱(chēng)為“位域”,或者“位段”。

位段(或稱(chēng)“位域”,Bit field)為一種數(shù)據(jù)結(jié)構(gòu),可以把數(shù)據(jù)以位的形式緊湊的儲(chǔ)存,并允許程序員對(duì)此結(jié)構(gòu)的位進(jìn)行操作。這種數(shù)據(jù)結(jié)構(gòu)的好處:

  • 可以使數(shù)據(jù)單元節(jié)省儲(chǔ)存空間,當(dāng)程序需要成千上萬(wàn)個(gè)數(shù)據(jù)單元時(shí),這種方法就顯得尤為重要。

  • 位段可以很方便的訪問(wèn)一個(gè)整數(shù)值的部分內(nèi)容從而可以簡(jiǎn)化程序源代碼。

  • 而位域這種數(shù)據(jù)結(jié)構(gòu)的缺點(diǎn)在于,其內(nèi)存分配與內(nèi)存對(duì)齊的實(shí)現(xiàn)方式依賴(lài)于具體的機(jī)器和系統(tǒng),在不同的平臺(tái)可能有不同的結(jié)果,這導(dǎo)致了位段在本質(zhì)上是不可移植的。

位域的定義是在結(jié)構(gòu)體中定義的時(shí)候完成的,其定義方式如下:

struct

{

  數(shù)據(jù)類(lèi)型 變量名 :位長(zhǎng)度;

  數(shù)據(jù)類(lèi)型 變量名 :位長(zhǎng)度;

} status;

比如,對(duì)于上面這個(gè)定時(shí)器的寄存器,我們可以定義如下:

struct

{

     unsigned char TIM_START_STOP : 1;

      unsigned char TIM_OVERFLOW : 1;

      unsigned char TIM_DIV : 4;

      unsigned char TIM_STAT : 2;

} register;

注意,這樣定義好之后,整個(gè)結(jié)構(gòu)體的位域定義時(shí)都是從低地址開(kāi)始的。因此,當(dāng)一個(gè)位域被定義好之后,其內(nèi)存的分布如圖2所示。

C語(yǔ)言結(jié)構(gòu)體的位域是什么

圖2 位域內(nèi)存分配

一旦當(dāng)位域定義好之后,比如圖2中的TIM_DIV,它所占用的比特?cái)?shù)為4bits,因此雖然我們定義它的時(shí)候是用unsigned char類(lèi)型去定義的,但是它最多能表示的二進(jìn)制數(shù)只有4位,即范圍為:0x00~0x0F。一旦當(dāng)我們賦值超過(guò)了次范圍,這個(gè)變量就會(huì)將多余的高位數(shù)據(jù)舍棄。

我們可以寫(xiě)一個(gè)程序來(lái)論證,按照?qǐng)D1所示的寄存器位分布,定義結(jié)構(gòu)體位域變量,接著給它賦一個(gè)超出它長(zhǎng)度的值,然后打印出來(lái)看看輸出。如圖3所示。

C語(yǔ)言結(jié)構(gòu)體的位域是什么

圖3 結(jié)構(gòu)體位域成員超出范圍

從圖3中我們可以看出,一旦當(dāng)某個(gè)位域成員超出其位數(shù)大小之后,編譯器先會(huì)拋出一個(gè)警告,然后將這個(gè)變量打印出來(lái)的值也是不對(duì)。那么為什么我們賦值20,卻輸出一個(gè)4呢?這是因?yàn)?0的二進(jìn)制數(shù)是0b00010100,而由于TIM_DIV變量只占有4個(gè)bit的存儲(chǔ)空間,因此超出的部分會(huì)被舍棄,最終只保留低4位0b0100,因此這個(gè)變量打印出來(lái)的值為4。

由于這個(gè)結(jié)構(gòu)體變量是占一個(gè)字節(jié)的存儲(chǔ)空間,因此我們可以用一個(gè)指針打印出這個(gè)存儲(chǔ)空間的全部?jī)?nèi)容。操作也很簡(jiǎn)單,我們只需定義一個(gè)unsignedchar類(lèi)型的指針,并且使結(jié)構(gòu)體的地址強(qiáng)行轉(zhuǎn)換為一個(gè)“unsigned char *”類(lèi)型,然后用指針指向它,最后引用指針將這個(gè)地址打印出來(lái),就可以看到這個(gè)結(jié)構(gòu)體全貌了。具體操作如圖4所示。

C語(yǔ)言結(jié)構(gòu)體的位域是什么

圖4 結(jié)構(gòu)體數(shù)據(jù)

為什么最后結(jié)果是0xA7呢?因?yàn)檎麄€(gè)結(jié)構(gòu)體按照位域賦值之后如圖5所示,最后轉(zhuǎn)換成十六進(jìn)制就是0xA7了。

C語(yǔ)言結(jié)構(gòu)體的位域是什么

圖5 位域賦值之后

到此,相信大家對(duì)“C語(yǔ)言結(jié)構(gòu)體的位域是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!


網(wǎng)站標(biāo)題:C語(yǔ)言結(jié)構(gòu)體的位域是什么
本文鏈接:http://weahome.cn/article/jsgjgp.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部