什麼是位段
位段是c語言特有的資料結構,它允許我們定義乙個由位組成的段,並可以給它賦乙個名字
struct a
;
a就是乙個位段型別。
位段和結構體的宣告是類似的,但是有兩點不用:
位段的成員必須是int、unsigned int、signed int或char型別
位段的成員名後面有乙個冒號和數字
位段的記憶體分配
位段的成員可以是int、unsigned int、signed int 或char(整形家族)型別
位段的空間上是按照乙個位元組或者四個位元組開闢的
位段有很多的不確定因素,位段是不跨平台的,所以可移植程式應避免使用位段
只有在連續的兩個變數型別相同時,才會共用一塊空間
//乙個例子
在vs2017下,列印結果是3 -4 3 4
在有的平台下,位段會預設第一位是符號位
位段的跨平台問題
int 位段被當成有符號數還是無符號數是不確定的。
位段中最大位的數目不能確定。(16位機器最大16,32位機器最大32,寫成27,在16位機器會出問題。)
位段中的成員在記憶體中從左向右分配,還是從右向左分配標準尚未定義。
當乙個結構包含兩個位段,第二個位段成員比較大,無法容納於第乙個位段剩餘的位時,是捨棄剩餘的位還是利用,這是不確定的
跟結構相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台的問題存在。
什麼是大端?什麼是小端
為什麼會有大小端
在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8 bit。但是在c語言中除了8 bit的char之外,還有16 bit的short型,32 bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式
例如:乙個 16bit 的 short 型 x ,在記憶體中的位址為 0x0010 , x 的值為 0x1122 ,那麼 0x11 為高位元組,0x22 為低位元組。對於大端模式,就將 0x11 放在低位址中,即 0x0010 中, 0x22 放在高位址中,即0x0011 中。小端模式,剛好相反。我們常用的 x86 結構是小端模式,而 keil c51 則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式
怎麼判斷乙個硬體平台是大端還是小端
1.利用聯合體來判斷(聯合體的存放順序是所有成員從低位址開始存放)
#include
union a
;int
main()
else
return0;
}
2.利用指標強制型別轉換判斷
#include
intmain()
else
return0;
}
大小端和作業系統有沒有關係
大小端和作業系統無關,和cpu架構有關
大小端 位域
小端 低位 lsb 位於低位址 大端 高位 msb 位於低位址 x86一般使用小端模式 位域 typedef union liteu32 t test t 位域的分配 小端 從lsb msb,從低位址到高位址 大端 從msb lsb,從高位址到低位址 例如 test t tt tt.t 0x3f p...
大小端,位域
大小端是指資料在記憶體中存放的順序,大於乙個位元組的整數,在記憶體中低位元組在前的就是小端,高位元組在前的就是大端。用c語言程式來判斷大端機還是小端機 include int main 位域 位域是指資訊在儲存時,並不需要占用完整的位元組,只需要占用幾個二進位制位。位域就是把乙個位元組中的二進位制位...
大小端 位域
聽到好幾個朋友說到去一些公司做面試,總是遇到關於大小端 位段 或者叫位域 和記憶體對齊的考題,然後就不知所措了。雖然我認為很多開發根本就用不到這個,但是我認為很有必要學習理解這些知識點,因為它可以讓你更了解c 的,了解程式在記憶體的運 況,也能加深對計算機系統的理解。宣告 由於本文的 會受到計算機環...