目錄
- 前言
- 什么是位段
- 位段的記憶體分配
- 位段的跨平臺問題
- 位段的應用
- 結語
前言
小伙伴們,我們上次學習了C語言中自定義資料型別的結構體,今天我們來學習一個更為深入的問題,
那就是用結構體實作位段,
小提示:如果沒有看過結構體相關知識的小伙伴可以點擊鏈接跳轉哦!
結構體的相關知識

什么是位段
什么是位段呢?
這里要注意啊!!
是位段!!
不是段位!!
千萬不要搞混淆了哦~

其實我們可以認為,位段就是一種特殊的結構體!
但是也與結構體有所區別,
位段的宣告與結構體是相似的
- 位段的成員必須是整型家族的,如char、 short、int、unsigned int 或signed int等 ,
- 位段的成員名后邊有一個冒號和一個數字,
比如:
struct A
{
int a:2;
int b:5;
int c:10;
int d:30;
};
上面的代碼就是一種位段的型別,
位段的記憶體分配
下面我們來看看位段的記憶體分配,
大家認為上面舉例子的代碼,struct A 的大小是多少呢?
我在VS2019默認的編譯環境下,大小為8.
那么這是為什么呢?
以下就是位段記憶體分配的規則:
位段的空間上是按照需要以4個位元組( int )或者1個位元組( char )的方式來開辟的,
定義位段資料大小的時候,不可以超過變數本身的位元組數大小,
也就是說,位段開辟空間的時候,會先看第一個資料型別是什么,如上述代碼第一個資料型別為int,而int型別默認是4個位元組,那么就會直接開辟4個位元組,也就是32個bit,
此時int a :2;后面的這個數字2,表示a只會占用32個bit中的2個,
此時剩下30個bit,那么b也會占用5個bit,c也會占用10個bit.
這時候,還剩下15個bit,不夠30個,那么就會再一次開辟4個位元組,用來存放資料,
需要注意的是
每個變數后面的數字,不可以超過變數型別本身的大小,這個栗子的話,就是后面的數字不能超過32.
位段的跨平臺問題
位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程式應該避免使用位段,
位段在實作中的很多細節,C語言的語法并沒有做出規定,
如:
一個位元組內部8個bit的資料是如何使用的?
先使用低bit還是高bit?
創建的int的32個bit是按照無符號整型還是有符號整型來處理?
如果剩下的bit不夠用來存放資料的時候,開辟了新的空間,那么是舍棄原來的不夠的空間,直接使用新開的空間,還是先把剩下的空間用完,不夠的在使用新的空間?
這些都是未知的,取決于編譯環境,
我使用的是VS2019,此時在一個位元組內部,位段是先使用低bit再使用高bit,而且如果要輸入的資料超過了規定的bit大小,那么就會發生截斷,舍棄高位溢位的資料,保留低位,
而且如果剩下的bit不夠之后,會開辟新的空間,原來不夠的剩下的空間會舍去,

此外,除了上面提到的問題,還有就是位段中最大位的數目不能確定,(16位機器最大16,32位機器最大32,寫成27,在16位機器會出問題,
正是由于這些不確定性,使得位段不具有跨平臺性,
所以,再一些情況下, 能夠用結構體解決的問題,我們就盡量用結構體的方式來解決,
位段的應用
盡管位段不具有跨平臺性,但是在一定的環境下還是有用武之地的,比如在一些記憶體比較小的運行壞境下,合理的使用位段,可以使得資料利用的更加合理,避免不必要的浪費,
比如,假如我們需要一個變數來表示性別的話,如果女用0表示,男用1表示,那么我們完全可以只用一個來bit,這樣就算是定義最小的char還能剩下7個bit,
當然,使用位段的時候,我們要清楚的明白當前環境下位段的使用特點,只有做到了解明白,才不至于使用錯誤,
補充:
位段的使用,一般是內部的成員變數都是同一型別的情況下使用,
要么全部都用int,要么全部都用char,至于混用的情況,由于我的水平有限,也沒了解,如果有了解的小伙伴,歡迎你們能夠教教我哦!
結語
由于本人水平有限,難免會有說錯或者說的不夠好的地方,希望各位能夠指出!
今天的學習到這里就結束啦!希望各位能夠給我點個關注,點個贊哦!
有什么想說的也歡迎再下面留言哦~

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330373.html
標籤:其他
上一篇:今天第一次在CSDN上發文章
