亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如下問題: 在short i:8 中的冒號是什么意思?

如下問題: 在short i:8 中的冒號是什么意思?

C++ C
皈依舞 2022-05-10 18:11:48
struct A{char t:4;char k:4;unsigned short i:8;unsigned long m;}sizeof(A)=?(不考慮邊界對齊)
查看完整描述

3 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

冒號是占位符。

有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有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位。

對于位域的定義尚有以下幾點說明:

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

例如:

struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}

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

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

例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};

從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
又:
1:指針類型變量不能指定所占的位數
2. 在聲明成員變量時,可以用 變量名 :bit數;
來確定結構體類型的成員變量的值所占的字位數,如果在實際應用中,該變量的值超出了在聲明它時所聲明的字位數,那么溢出的部分將會丟失。



查看完整回答
反對 回復 2022-05-15
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

這個是struct的一個性質。
就是在結構體中指明,變量所占的位數。
因為unsigned short i;正常在32位機器中,是占16位的。
而由于程序中結構體,不需要那么多位,程序員,認為8位就足夠了,為了節省內存空間,所以它特別指出,這個變量占8位。
unsigned short i:8;
不考慮邊界對齊的話,就是想加可以,但是實際程序中,是有邊界對齊的。
就是1+1+4=6.字節。
注意上面的是以位為單位。
char t:4;
char k:4;
unsigned short i:8;
其中4,4,8指的是位。而sizeof求的是字節。
不知道說清楚沒。


查看完整回答
反對 回復 2022-05-15
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

位域。
意識是說i是個8位的short類型。

查看完整回答
反對 回復 2022-05-15
  • 3 回答
  • 0 關注
  • 162 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號