C語言的位段與枚舉詳解
1.什么是位段?
位段的聲明和結(jié)構(gòu)是類似的,有兩個(gè)不同:
①位段的成員必須是 int、unsigned int 或signed int
②位段的成員名后邊有一個(gè)冒號(hào)和一個(gè)數(shù)字
例如:
struct A { ? ? ? ? //4byte=32bit ? ?int 4個(gè)字節(jié) ? ? ? ? //開辟4個(gè)字節(jié) ? ? ? ? int _a : 2 ;//30(分配了2字節(jié),還剩30字節(jié)) ? ? ? ? int _b : 5 ;//25 ? ? ? ? int _c : 10 ;//15 ? ? ? ? //在開辟4個(gè)字節(jié) ? ? ? ? int _d : 30 ;//超出剩余的開辟內(nèi)存大小,根據(jù)C標(biāo)準(zhǔn)可能用前面的15字節(jié)在開辟15字節(jié) ? ? ? ? ? ? ? ? ? ? ? ? ? ? //也可能不用重新開辟30字節(jié) };
簡言之:位段就是規(guī)定變量占的比特位!
2.位段的內(nèi)存分配、跨平臺(tái)與使用
特別提醒:
1. 位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類型
2. 位段的空間上是按照需要以4個(gè)字節(jié)( int )或者1個(gè)字節(jié)( char )的方式(char準(zhǔn)確來說是int類型,反匯編內(nèi)部處理為int)來開辟的
3. 位段涉及很多不確定因素,位段是不跨平臺(tái)的,注重可移植的程序應(yīng)該避免使用位段(問題在于多余內(nèi)存使用和開辟上) 例如:
struct S { char a:3; char b:4; char c:5; char d:4; }; struct S s = {0}; s.a = 10; s.b = 12; s.c = 3; s.d = 4;
位段的跨平臺(tái)問題:
1. int 位段被當(dāng)成有符號(hào)數(shù)還是無符號(hào)數(shù)是不確定的。
2. 位段中最大位的數(shù)目不能確定。(16位機(jī)器最大16,32位機(jī)器最大32,寫成27,在16位機(jī) 器會(huì)出問題。
3. 位段中的成員在內(nèi)存中從左向右分配,還是從右向左分配標(biāo)準(zhǔn)尚未定義。
4. 當(dāng)一個(gè)結(jié)構(gòu)包含兩個(gè)位段,第二個(gè)位段成員比較大,無法容納于第一個(gè)位段剩余的位時(shí),是 舍棄剩余的位還是利用,這是不確確定的。
總結(jié): 跟結(jié)構(gòu)相比,位段可以達(dá)到同樣的效果,但是可以很好的節(jié)省空間,但是有跨平臺(tái)的問題存在
位段的應(yīng)用:
3.什么是枚舉?
枚舉顧名思義就是一一列舉。
把可能的取值一一列舉。
例如:
//(可能取值都是有值的,默認(rèn)從0開始,一次遞增1,當(dāng)然在定義的時(shí)候也可以賦初值) enum Day//星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum Sex//性別 { MALE, FEMALE, SECRET }; enum Color//顏色 { RED, GREEN, BLUE }; //以上定義的 enum Day , enum Sex , enum Color 都是枚舉類型 //{}中的內(nèi)容是枚舉類型的可能取值,也叫枚舉常量 //枚舉的初始化 enum Color//顏色 { RED=1, GREEN=2, BLUE=4 };
4.枚舉的優(yōu)點(diǎn)與使用
我們可以使用 #define 定義常量,為什么非要使用枚舉?
枚舉的優(yōu)點(diǎn):
1. 增加代碼的可讀性和可維護(hù)性
2. 和 #define 定義的標(biāo)識(shí)符比較枚舉有類型檢查,更加嚴(yán)謹(jǐn)。
3. 防止了命名污染(封裝)
4. 便于調(diào)試
5. 使用方便,一次可以定義多個(gè)常量
枚舉的使用:
enum Color // 顏色 { RED = 1 , GREEN = 2 , BLUE = 4 }; enum Color clr = GREEN ; // 只能拿枚舉常量給枚舉變量賦值,才不會(huì)出現(xiàn)類型的差異。 clr = 5; //這樣是錯(cuò)誤的!
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
深入探討:宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別
本篇文章是對(duì)宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++ inline內(nèi)聯(lián)函數(shù)詳解
這篇文章主要介紹了C++ inline內(nèi)聯(lián)函數(shù)詳解,有感興趣的同學(xué)可以借鑒參考下2021-02-02MFC實(shí)現(xiàn)學(xué)生選課系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)學(xué)生選課系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02C++設(shè)計(jì)模式之組合模式(Composite)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之組合模式Composite,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04C++實(shí)戰(zhàn)之二進(jìn)制數(shù)據(jù)處理與封裝
在電腦上一切數(shù)據(jù)都是通過二進(jìn)制(0或1)進(jìn)行存儲(chǔ)的,通過多位二進(jìn)制數(shù)據(jù)可以進(jìn)而表示整形、浮點(diǎn)型、字符、字符串等各種基礎(chǔ)類型數(shù)據(jù)或者一些更復(fù)雜的數(shù)據(jù)格式。本文將為大家詳細(xì)講講二進(jìn)制數(shù)據(jù)處理與封裝,需要的可以參考一下2022-08-08C++ 中CloseHandle 函數(shù)--關(guān)閉一個(gè)句柄
這篇文章主要介紹了C++ 中CloseHandle 函數(shù)--關(guān)閉一個(gè)句柄的相關(guān)資料,需要的朋友可以參考下2017-05-05C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)csv文件轉(zhuǎn)xls
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)csv文件轉(zhuǎn)xls功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以了解一下2022-06-06