大小端模式

2021-07-31 16:31:35 字數 2229 閱讀 6839

承接《陣列指標和指標資料》最後有個關於大小端的問題

上面這個問題似乎還沒啥技術含量,下面就來個有技術含量的:在x86 系統下,其值為多少?

int main()

;int *ptr1=(int *)(&a+1);//指向a陣列後面的記憶體單元,&a+1表示向後移16個儲存單元

int *ptr2=(int *)((int)a+1);//表示a的儲存單元的位址增加乙個位元組

printf("%x,%x",ptr1[-1],*ptr2);//ptr1[-1]其實指向的是a陣列的最後乙個單元,*ptr1則表示a陣列的位址後移乙個位元組之後的4個連續儲存單元所儲存的值

return 0;

}其記憶體布局如下圖:

編輯大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。

小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。

例子 

int num1 = 1;

num1 補碼 0x00000001

大端模式(big-endian模式)記憶體儲存次序 0x00000001 

小端模式(little-endian模式)記憶體儲存次序0x01000000

實體測試大小端模式

示例**

#include "stdafx.h"

#include using namespace std;

int main()

; int *ptr1 = (int *)(&a + 1);//指向a陣列後面的記憶體單元,&a+1表示向後移16個儲存單元

int *ptr2 = (int *)((int)a + 1);//表示a的儲存單元的位址增加乙個位元組

cout << ptr1[-1] << endl;//ptr1[-1]其實指向的是a陣列的最後乙個單元,*ptr1則表示a陣列的位址後移乙個位元組之後的4個連續儲存單元所儲存的值

cout << *ptr2 << endl;

cout << *ptr1 << endl;

return 0;

}

執行系統64位 win7,編譯器visual studio2015 x86 執行結果:

看一下記憶體位址

從記憶體中可以看出該模式是

小端模式

&a 是整個陣列的首位址,a是陣列首元素的首位址(參考《陣列指標和指標資料》)

ptr1 = a + 16

ptr2 =  a + 1

ptr2 為什麼等於33554432呢?

ptr2記憶體如下圖

由於該模式是小端模式,*ptr2補碼是 0x02000000 轉為二進位制則是33554432

怎樣判斷當前作業系統是什麼模式呢

聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性可以輕鬆地獲得了cpu對記憶體採用little-endian還是big-endian模式讀

bool checkcpu()

c; c.a = 1;

return(c.b == 1);

}

擴充套件x86結構的計算機使用的都是小端模式。一般來說,大部分使用者的作業系統(如windows,freebsd,linux)都

是小端模式。少部分,如mac os是大端模式

在網路上傳輸資料時,由於資料傳輸的兩端對應不同的硬體平台,採用的儲存位元組順序可能不一致。因此在tcp/ip協議規定了在網路上必須採用網路位元組順序,也就是大端模式。

對於char型資料只佔乙個位元組,無所謂大端和小端。而對於非char型別資料,必須在資料傳送到

網路上之前將其轉換成大端模式。接收網路資料時按符合接受主機的環境接收。

大小端模式

偶 注意 大小端的高低位資料是按位址來計算的。如0x1001,10是高位位元組,01是低位位元組。char s abcd a是高位位元組 所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順...

大小端模式

所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...

大小端模式

端模式 endian 的這個詞出自jonathanswift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為bigendian,從尖頭開始將雞蛋敲開的人被歸為littileendian。小人國的內戰就源於吃雞蛋時是究竟從大頭 big endian ...