教材裏沒有的:結構體裏後綴“: 1”或者“: 4”

有的結構體定義裏成員後面還跟個”:1“或者”:4“……

 這個問題是看交給我維護的結構體代碼時發現的,因爲過去沒見過,百度了一下還不錯找到了意思解釋,然後自己又用sizeof()試了試,挺好玩的,分享出來~

 

=========分割線=========得知自:https://wenwen.sogou.com/z/q771353044.htm

struct BIT16_flag{
  unsigned char b0:1;
...............
  unsigned char b15:1;
};

我知道這個結構體裏面有 16個 char 成員,
我想問這個結構體 一共佔多少個字節?
還有,每個變量 後面加個 :1 是什麼意思?

 

下面是找到的解釋:

每個都佔一位```若不夠放存入下個字節中··
1共佔2個字節``

:1是按位存儲·
如

struct xxx 
{ 
              成員 1 類型成員 1 : 成員 1 位數 ; 
               成員 2 類型成員 2 : 成員 2 位數 ; 
               成員 3 類型成員 3 : 成員 3 位數 ; 
}; 
基本的成員變量就會被拆分!這個語法在初級編程中很少用到,但是在高級程序設計中不斷地被用到!例如: 
struct student 
{ 
                unsigned int sex : 1; 
              unsigned int age : 15; 
}; 
上述結構體中的兩個成員 sex 和 age 加起來只佔用了一個 unsigned int 的空間(假設 unsigned int 爲 16 位)。 
基本成員變量被拆分後,訪問的方法仍然和訪問沒有拆分的情況是一樣的,例如: 
struct student sweek; 
sweek.sex = MALE;// 這裏的 MALE 只能是 0 或 1 ,值不能大於 1 
sweek.age = 20; 
雖然拆分基本成員變量在語法上是得到支持的,但是並不等於我們想怎麼分就怎麼分,例如下面的拆分顯然是不合理的: 
struct student 
{ 
                  unsigned int sex : 1; 
                unsigned int age : 12; 
}; 
這是因爲 1+12 = 13 ,不能再組合成一個基本成員,不能組合成 char 、 int 或任何類型,這顯然是不能 “ 自圓其說 ” 的。

=====分割線===============

 

以下是自己寫的:

這是c++11裏才能用的東西。

另外sizeof只能返回整數的字節數,遇到不足1字節的會報錯,但是當結構體所有成員的類型所佔內存超過了1字節則能使用,而且有內存補齊的影響。

複製運行一下下面我給出的代碼,再看一遍註釋,就都能明白了~

#include<iostream>
using namespace std;
struct A
{
	char one : 4;//4 bit=0.5 Byte
	char ten : 4;
	//0.5+0.5=1字節
};
struct B
{
	char one : 1;//1 bit=0.5 Byte
};
struct C
{
	char one : 4;//0.5Byte=4bit
	char ten;//1byte=8bit
	int hun;//4byte=32bit
};
void main()
{
	struct A a;
	cout << sizeof(a) << endl;
	struct B b;
	cout << sizeof(b) << endl;//0.5字節,不足1字節,使用sizeof會出錯(有的編譯器不出錯,而輸出1)
	struct C c;
	cout << sizeof(c) << endl;//由於內存補齊,最大爲int,2int的8byte>(0.5byte+1byte+4byte),所以輸出8
	//類型c的問題是 用sizeof函數來定義報文長度時需要注意的地方!	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章