位段 大小端

2021-10-12 03:44:02 字數 1816 閱讀 5519

什麼是位段

位段是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 的,了解程式在記憶體的運 況,也能加深對計算機系統的理解。宣告 由於本文的 會受到計算機環...