❶ c語言結構體位域問題
不是的,結構體變數只是整個結構體存儲的首地址,每個位域沒有具體規定大小,所以整個結構體也沒有規定大小,要看你定義的位域的類型。例如8個int型位域和8個double型位域存儲空間是不一樣的
❷ 請教一個關於C/C++位域問題
譚浩強的書。。。
首先,位域類型並不限於unsigned或int,只不過它們應用比較多,因為結構體在內存中一般是按照4位元組對齊的。但是也可能只需要大小不超過4位元組的結構體,那麼int就顯得不合適了。
樓下那位「什麼int,short都是沒有作用的」說的並不對,就像你舉得這個例子中,如果把unsigned short都改為 unsigned int,那麼最終sizeof()的結果就與原來不符
❸ 解釋下位域,為什麼要用位域,位域的好處
位域是指信息在存儲時,並不需要佔用一個完整的位元組,
而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1
兩種狀態,
用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為"位域"或"位段"。所謂"位域"是把一個位元組中的二進位劃分為幾
個不同的區域,
並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。
這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。
使用位域的好處是:
1.有些信息在存儲時,並不需要佔用一個完整的位元組,
而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1
兩種狀態,
用一位二進位即可。這樣節省存儲空間,而且處理簡便。
這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。
2.可以很方便的利用位域把一個變數給按位分解。比如只需要4個大小在0到3的隨即數,就可以只rand()一次,然後每個位域取2個二進制位即可,省時省空間。
❹ C語言中位域大小與寬度該怎麼算
1 8;
分析第一個: 在結構體里 他使用了位域 然後 a使用了2位 b使用了3位 c使用了3位 這里剛好用掉了8位 一共是一個位元組 然後在對結構體分析 結構體里只有unsigned char類型 這個類型佔了一個位元組 然後 然後結構體的大小必須是結構體里最長的類型的整數倍 這裡面就是1的整數倍 然後結合上面用了1位元組 所以結果是1
分析第二個: 2 3 3一樣的和上面, 然後裡面多一個unsiged int 這個東西在裡面佔用4個位元組 那麼結構體的大小就必須是4的倍數 然後裡面存取的結果就是 a 2位 b 3位 c 3位 然後這是一個位元組 然後與unsiged int對其 空出3個位元組補0; 然後放一個d; 然後d前四位有數 後面補0;
❺ 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 /*該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行中使用了復合位運算"|=", 相當於: pbit->c=pbit->c|1其結果為15。程序第17行用指針方式輸出了這三個域的值。
❻ 單片機的位域是什麼意思如何使用
標准C提供了一種基於結構體的數據結構--位域(BitField),位域就是把一個
存儲單元
中的
二進制
劃分為幾個不同的區域。並說明每個區域的
位數。每一個域有一個
域名
,允許在
程序
中按域名進行操作,位域的定義格式如下:
struct
位域結構名{
位域列表
};
位域列表格式為:類型說明符
位域名:位域長度如:
struct
k{
unsigned
int
a:1
unsigned
int
:2
unsigned
int
b:3
unsigned
int
:0
//空域
}k1;
說明:
1)各位依次從低位到高位排列,排滿一個存儲單元,按地址接著排下一單元;
2)位域可以無域名,但不能被引用,如
第二域
,這時其只用來填充或調整位置;
3)第四行稱空域,目的是將目前存儲單元的剩餘部分分為一個域,且填充0。
位域的引用很簡單,如:
k1.a=1;
//置k1的b0位為1
k1.b=7;
//將k1的b3-5位置111
通過位域定義位
變數
,是實現單
個位
位操作的重要途徑和方法,採用位域定義位變數,產生的
代碼
緊湊、高效。這種位域應用於
單片機
開發比較普遍。
❼ C++問題,急啊。。。分別用結構體和位域兩種方法存儲學生身高,體重和成績等信息,並以總和為依據進行排序
1. 結構體里的對字元串的賦值轉換出錯,能不能再說的明白點具體哪裡出錯?我測試中貌似沒有出錯
2.位域結構體,指定了多少位應該不能用cin來讀入了(否則容易導致溢出),解決辦法是使用中間變數來讀入,比如可以如下:
int temp[3];
for(i = 0;i<3;i++)
{
cout<<"請依次輸入該學生的身高,體重和成績:"<<endl;
cin>>temp[0]>>temp[1]>>temp[2];
a[i].height = temp[0];
a[i].weight = temp[1];
a[i].score = temp[2];
}
❽ 求助關於位域存儲順序如題 謝謝了
回復
把a放到最下面就行了,你放到最開始當然是bit0了.我想說的是,不管是大端還是小端,你放到哪兒,他肯定就位於哪兒,不需要用什麼條件編譯來區別大小端
❾ c語言 結構體位域問題
c存在第三個位元組
sizeof結構體,這個要看結構體內變數是如何定義的,結構體存放數據有個對齊原則,找到佔用最大位元組的變數,然後都向它對齊,比如bool和char類型佔用一個位元組,short占兩個位元組,int,float為4個位元組,double為八個位元組。
定義的順序不同,sizeof的結果不同。我給你舉個例子。
structA{
inta;
charb;
charc;
};
sizeof(A)應該為4+1+1,但是需要對齊,所以這個值就是8
圖2
這個是struct B的變數存儲
❿ 數據結構 -- 位域
一個位元組有8位,在存儲時有些數據並不需要佔用一個完整的位元組,只需要佔用一個或幾個二進制位即可。例如開關只有通電和斷電兩種狀態,用 0 和 1 表示足以,也就是用一個二進位。基於這種考慮, C 語言提供了『 位域 』這個數據結構。
在結構體定義時,我們可以指定某個成員變數所佔用的二進制位數(Bit),這就是位域。來看下面的例子:
當限制了成員的位數時,如果給成員賦值超過其位數,則會導致數據溢出。來看下面的例子:
上面定義了結構體變數a,包含一個非位域成員m,以及兩個位域成員n、ch。分別進行兩次賦值並輸出,輸出結果如下所示:
第一次賦值的輸出結果分析:
第二次賦值的輸出結果分析:
位域的儲存規則如下:
位域實質上是含有位域成員的結構體,所以除了遵循這個儲存規則外,還需要遵循結構體分內存對齊規則,接下來通過如下示例來分析位域的存儲邏輯。
示例1:
輸出結果分析:
因此,bs總共需要22位內存,即3位元組,而根據結構體對齊規則,bs的內存必須為其最大成員類型長度(int)的整數倍,所以最終輸出為4位元組。
示例2:
輸出結果分析:
因此,bs總共需要86位的內存空間,即11位元組,而根據結構體對齊規則,bs的內存必須為其最大成員類型長度(int)的整數倍,所以最終輸出為12位元組。
示例3:
輸出結果分析:
因此,bs需要152位的內存,即19位元組,經由結構體內存對齊,需要是4位元組的倍數,所以最終輸出為20位元組。
1. 數據結構 -- 結構體Struct
2. 數據結構 -- 共用體Union