大小端模式和直接向記憶體賦值

2021-06-26 10:13:34 字數 1246 閱讀 6599

一、大小端模式

大端模式:資料的低位儲存於記憶體的高位位址,資料的高位儲存於記憶體的低位位址。

小端模式:資料的低位儲存於記憶體的地位位址,資料的高位儲存於記憶體的高位位址。

在32位處理器中,儲存int型資料需要4個位元組。資料0x12345678 大端模式和小端模式儲存示意圖如下。需要注意的是:無論是大端模式還是小端模式,資料0x12345678的位址都是記憶體中儲存該資料的起始位址(即位址a)。

有的處理器系統採用了小端方式進行資料存放,如intel的奔騰。有的處理器系統採用了大端方式進行資料存放,如ibm半導體和freescale的powerpc處理器。不僅對於處理器,一些外設的設計中也存在著使用大端或者小端進行資料存放的選擇[1]。

下面看一道題目:寫乙個函式判斷處理器是大端模式還是小端模式。

1 #include 2 #include 3 #include 4 

5 int

6 main()

7 14 else

17 }

思考:上面的**作如下的修改,輸出的結果和上次一樣麼?

修改後的**:

1 #include 2 #include 3 #include 4 

5 int

6 main()

7 14 else

17 }

二、c語言中直接向記憶體賦值

無論處理器是大端模式還是小端模式,修改後的**判斷結果都是大端模式,原因在於第8行的賦值。「int a = 0xff」,這種賦值方法是直接賦值給記憶體的。假設處理器是小端模式,由於計算機中資料的儲存是以補碼的方式存在的,所以p所指向的記憶體(乙個位元組)中儲存的是負數的補碼(0xff最高位(第7位)是符號位)。0xff的原碼是0x81(0xff按位取反後加1),最高位(第7位)是符號位,所以*p的值是-1,判斷結果是大端模式。解決方法是把char *p 改為unsigned char *p。**如下。

修改char *p為unsigned char *p:

1 #include 2 #include 3 #include 4 

5 int

6 main()

7 14 else

17 }

c語言直接向記憶體賦值,很好地體現了c語言的低極性。

結構體內存對齊和大小端

結構體怎麼對齊?1.第乙個成員與結構體變數偏移量為0的位址處開始數 2.其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處 注意 對齊數,vs中是8,linux中是4 3.結構體的總大小為最大對齊數 每個成員變數除了第乙個成員都有乙個對齊數 的整數倍 4.如果巢狀了結構體的情況,巢狀的結構體對齊...

資料在記憶體中的大小端模式儲存

大端模式 資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中。因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型 要看具體的編譯器...

大小端模式和網路位元組序

概念 在幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列。例如在c語言中,乙個型別為int的變數x位址為0x100,那麼其對應位址表示式 x的值為0x100。且x的四個位元組將被儲存在儲存器的0x100,0x101,0x102,0x103位置。大端位元組序 在記憶體中,低位址存放資料的高位,...