C C 大小端 位域 記憶體詳解

2021-09-24 18:00:49 字數 1662 閱讀 5816

面試時遇到關於大小端、位段(或者叫位域)和記憶體對齊的考題,然後就不知所措了。這部分對於嵌入式底層工作者是必須要掌握的,其他方面不是必須的;但還是很有必要學習理解這些知識點,因為它可以讓你更了解c++的,了解程式在記憶體的運**況,也能加深對計算機系統的理解。

1、從靜態儲存區分配:此時的內存在程式編譯的時候已經分配好,並且在程式的整個執行期間都存在。全域性變數,static變數等在此儲存。

3、在堆區分配:動態分配記憶體。用new/malloc時開闢,delete/free時釋放。變數的生存期由使用者指定,靈活,但會有記憶體洩露等問題。

一般涉及到大小端問題都是針對的float、int、long等等非乙個位元組型別的資料型別,像c/c++中的char這樣的資料型別,它本身就是占用乙個位元組的大小,不會產生什麼問題。例如 int資料型別,在32位系統中,佔4個位元組,那這樣4個位元組存放空間位址是什麼樣的順序呢,這就涉及到了大小端的原理了。

常用的x86結構都是小端模式,而大部分dsp,arm也是小端模式,不過有些arm是可以選擇大小端模式,keil c51是大端的。

大端:數值的高位元組放在記憶體的低位址處,數值的低位元組放到高低址處;就是高位在前。

小端:數值的低位元組放在記憶體的低位址處,數值的高位元組放到高低址處;就是低位在前。

示例:int height = 0x12345678,&height = 0x0042ffc4

小端模式:

位址0x0042ffc4

0x0042ffc5

0x0042ffc6

0x0042ffc7

數值0x78

0x56

0x34

0x12

大端模式:

位址0x0042ffc4

0x0042ffc5

0x0042ffc6

0x0042ffc7

數值0x12

0x34

0x56

0x78

在計算機中,是採用0 ,1表示資料的,每乙個0或者1占用1位(bit)儲存空間,8位組成乙個位元組(byte),為計算機中資料型別的最小單位,如char在32bit系統中占用乙個位元組。但有的時候,我們只需要bool型別的資料量,但c/c++裡面沒有bool型別的資料,那如何使用bool型別的資料量呢,這就涉及到了位域的概念;並且使用位域(有的叫做位段)可以節省空間。

具體的語法就是在變數名字後面,加上冒號(:)和指定的儲存空間的位數。具體的定義語法如下:

struct a;
a.a = 2;

a.b = 4;

a.c = 1;

a.d = 18;

sizeof(a) = 8;

假如 a 的位址為0x0004b80,則

位址0x0004b80

0x0004b81~ 0x0004b83

0x0004b84~ 0x0004b87

7~6c:2

b:3a:2d數值

0132

18在這裡講解位域的時候,涉及到了記憶體對齊或者叫位元組對齊的概念,在下面講解到。

具體詳細的請看我另外三篇專門講解位元組對齊的部落格:

#pragma pack(n)記憶體分配:

c語言 位元組對齊問題 詳解:

#pragma pack(push,1)與#pragma pack(1)的區別:

大小端 位域

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