新唐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字節。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260056.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為榮耀5cvs華為v9play_華為榮耀v9play和榮耀9哪個好_華為榮耀v9play和榮耀9對比評測_飛翔教程...

華為榮耀v9play是華為最新發布的手機,這款手機可以說是華為榮耀v9的青春版,把這款手機跟華為榮耀9對比起來哪款更好呢?下面就為大家帶來詳細的華為榮耀v9play和榮耀9對比評測!榮耀9介紹:6.12日下午,榮耀在上…

頸椎病防治指南

2019獨角獸企業重金招聘Python工程師標準>>> 長期從事財會、寫作、打字、辦公室等職業的工作人員,由于長期低頭伏案工作,使頸椎長時間處于屈曲位或某些特定體位,不僅使頸椎間盤內的壓力增高,而且也使頸部肌肉長期處于非…

如何熟悉一個開源項目

轉自:http://www.blogjava.net/killme2008/archive/2012/05/22/378885.html 你有個任務,需要用到某個開源項目;或者老大交代你一個事情,讓你去了解某個東西。怎么下手呢?如何開始呢?我的習慣是這樣: 1.首先…

離散序列卷積c語言,數電實驗一離散卷積的C語言編程.ppt-資源下載在線文庫www.lddoc.cn...

數電實驗一 離散卷積的C語言編程.ppt實驗一 離散卷積的C語言編程實驗,DSP實驗室,實驗性質,綜合設計性實驗,實驗目的,1 了解和認識常用的各種信號; 2 掌握卷積的定義和計算方法; 3 掌握在計算機中生成以及繪制信號序列圖的方法。,實驗原理,離散時間系統中…

三個數差的平方公式推導過程_平方差公式證明推導過程及運用詳解(數學簡便計算方法之一)...

?平方差公式是小學奧數計算中的常用公式。通常寫為:a-b(ab)x(a-b)它的幾何方法推導過程是這樣的:如下圖所示,四邊形ABCD和四邊形DEFG為正方形,邊長分別為a和b,求陰影部分面積。純手繪顯然,陰影部分面積有2…

zabbix簡單介紹(1)

zabbix概念是一個基于WEB界面的提供分布式系統監控以及網絡監視功能的企業級的開源解決方案。zabbix監控途徑zabbix agentsnmp agentipmi agent(硬件)agentless monitoring(無agent的監控)web monitoring 監控web頁面,下載(速度),響應,認證等(web本身的服務狀態)database monit…

c語言集合除去相同元素,使用C語言去掉字符串集合重復元素

有一種最直接的方法可以去掉一個集合中重復的元素,這種方法據說就是“交給下面去做”,然而有時候,你自己動手去做一下也是不錯的。如果交給下面去做,最直接的選擇就是使用map,在java中,我們有HashMap&#…

Zynq7000系列之芯片引腳功能綜述

很多人做了很久的FPGA,知道怎么去給信號分配引腳,卻對這些引腳的功能及其資源限制知之甚少;在第一章里對Zynq7000系列的系統框架進行了分析和論述,對Zynq7000系列的基本資源和概念有了大致的認識,然而要很好地進行硬件…

python模擬購物車購物過程_python實現購物車+ATM機 第五天

模擬實現一個ATM 購物商城程序1.額度 15000或自定義2.實現購物商城,買東西加入 購物車,調用信用卡接口結賬3.可以提現,手續費5%4.每月22號出賬單,每月10號為還款日,過期未還,按欠款總額 萬分之5 每日計息5…

C#使用Cookie方法

代碼Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> //寫入protected void Button1_Click(object sender, EventArgs e){HttpCookie cookienew HttpCookie("MyCook");//初使化并設置Cookie的名稱DateTime…

智能手機計步算法c語言實現,【轉載】智能手機計步器算法的實現

現在的智能手機嵌入了一些微小的傳感器,比如重力傳感器、光傳感器、聲音傳感器等。如何有效地利用這些傳感器來開發一些應用,是一個值得深入研究的課題。比如開發醫療健康的應用、運動量監視器等。本文采用htc Touch Pro智能手機的重力傳感器來開發一款監…

vue點擊按鈕怎么跳轉圖片_vue-router組件里面點擊一個按鈕跳轉到一個新的組件該怎么實現...

展開全部直接修改地址欄中的路由地址即可:{{msg}}var testLogin Vue.component("login",{template:這是我的登錄頁面})var testRegister Vue.component("register",{template:這是我的注冊頁面})//配置路由詞典//對象數組const myRoutes [//…

Arduino教程資料匯總(8月22日悄悄跟新了一下)

http://www.geek-workshop.com/thread-985-1-1.html 本帖最后由 迷你強 于 2013-8-31 12:36 編輯 F-101 arduino基礎套件使用資料 Arduino入門教程--課前準備--Arduino驅動安裝及1.0 IDE菜單介紹Arduino入門教程--第一課--板載Led閃爍實驗Arduino入門教程--第二課--第一次面包板…

HTML5/CSS3系列教程:HTML5 區域(Sectioning)的重要性

日期:2013-2-4 來源:GBin1.com 不管你以前在web頁面布局中如何稱呼它們 - “區域”還是“塊”,我們一直都在布局中將頁面分成可視的不同區域。但真正的問題在于我們并沒有使用任何正確的工具來實現。一般情況下我們使用典型的網格來劃分頁頭…

CoreAnimation —— CAReplicatorLayer(拷貝圖層)

2019獨角獸企業重金招聘Python工程師標準>>> CAReplicatorLayer是一個layer容器,會對其中的subLayer進行一些差異處理(它的子layer都可以拷貝) 屬性: //拷貝的次數 property NSInteger instanceCount; //是否開啟景深效…

c語言用數組寫密碼程序,想程序高手求助--用C語言來編輯一個輸入密碼的程序...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓/*--------實現密碼的隱式輸入-----------------*/inputpw(char *password,int len) /*len為密碼長度*/{int i0; /*密碼數組索引值,同時也表示記錄已顯示*的數目*/char ch;fflush(stdin); /*清洗流,以防妨礙密碼正確輸入…

ps流 轉發_RTP協議全解析(H264碼流和PS流)(轉)

[LeetCode] Arranging Coins 排列硬幣You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...使用Jenkins可持續集成maven項目首先下載最新的Jenkins的war包,放在tomcat的webapps的目錄下,然后運行,例…

android 接收短信代碼,短信接收功能實現的代碼

其中包含了widget必備的要素以及對應文件分別為:appwidgetprovider--------------------------SmsWidget.javawidget的config--------------------------SmsWidgetConfig.javawidget引發的app-------------------------SmsAider.javaappwidgetproviderinfo---------…

使用MeanJS Yeoman Generator

1、首先全局安裝該生成器 sudo npm install -g generator-meanjs 2、為項目創建一個路徑 mkdir xmen && cd xmen 3、創建app yo meanjs 根據提示,輸入應用名,描述,關鍵詞,是否創建crud例子。。 4、運行app sudo NODE_ENVd…

Entity Framework With Oracle

雖然EF6都快要出來了,但是對于Oracle數據庫,仍然只能用DB first和Model First來編程,不能用Code First真是一個很大的遺憾啊。 好了,廢話少說,我們來看看EF中是如何用DB first和Model First來對Oracle編程的。 首先我們…