1. 程式人生 > >大端和小端

大端和小端

基本概念

我們可以把計算機的記憶體抽像成一個大的陣列,在這個陣列中,包含了一個個的位元組元素。對於大小端的討論,我們可以認為記憶體的最小單元即是一個位元組(byte)。對於每個位元組,我們可以使用一個“索引”來標識,這個索引亦即我們平常所說的記憶體的地址。
假定計算機的字長為32位,即一個字包括4個位元組。對於一個32位整數,例如,0x90AB12CD。由於每個十六進位制的數字代表了4個位(bits),故我們需要8個十六進位制數字來表示這個32位整數。即這個32位整數的四個位元組分別為
90, AB,12,CD
根據儲存這4個位元組順序的不同,可以分為大端儲存和小端儲存。

大端(Big Endian)

如果一個數據的高位元組儲存在記憶體的低地址處,資料的低位元組儲存在記憶體的高地址處,則這種存儲存方式稱為大端儲存模式。
例如,對於0x90AB12CD儲存在記憶體地址為1000開頭的四個位元組處,如果使用大端儲存,則其記憶體佈局如下圖所示:
大端儲存

小端(Little Endian)

如果一個數據的高位元組儲存在記憶體的高地址處,資料的低位元組儲存在記憶體的低地址處,則這種存儲存方式稱為小端儲存模式。
例如,對於0x90AB12CD儲存在記憶體地址為1000開頭的四個位元組處,如果使用小端儲存,則其記憶體佈局如下圖所示:
小端儲存

Endian名稱的歷史由來

Jonathan Swift在其諷刺小說Gulliver’s Travels(《格利佛遊記》)描述了以下情景。在一個小人國,對如何吃水煮蛋存在分歧,有的認為先從小的一端剝開,有的認為先從大的一端剝開,因此形成了兩派,支援從大端剝開的稱為(Big Endian),支援從小端剝開的稱為(Little Endian),並引發了一場戰爭。
這是endian一詞的最早由來。

誤區

大小端僅在一個數的儲存結構可以被切分為多個不同的儲存單元時才有意義,這時,我們必須確定儲存的順序。
對於一個32位的暫存器來說,要儲存一個32位的數值,在這種情況下,沒有大小端的概念。這個暫存器的最右端位儲存這個數的低位,最左端位儲存數的高位。
同樣的,對於一個C風格的字串(C-style string,以’\0’結尾的字串)來說,也不存在大小端的概念。C-style string可以看成字元陣列,陣列的每個元素為一個儲存了單個字元的位元組。對於陣列來說,記憶體地址總是遞增的。例如&arr[i]的值小於&arr[i+1]的值。這樣,C-style string字元的地址也是從左往右依次遞增。
故C-style string不存在需要確定字元儲存順序的問題,也即不存在大小端的概念。

程式判斷大小端模式

int main()
{
    unsigned int i = 1;
    char *p = (char*)&i;

    if (*p)
        cout << "little" << endl;
    else
        cout << "big" << endl;

    return 0;
}

變數i為非負整型,佔四個位元組(32位),其值為0x00000001,即
00,00,00,01
為了確定低位的1儲存在記憶體地址的低位還是記憶體地址高位,我們使用char*型指標p指向i的第一個位元組,通過判斷*p的值,即可以確定機器是大端還是小端。如果低位的1儲存在記憶體地址的低位,即*p不為0,說明為小端模式;如果低位的1儲存在記憶體地址的高位,即*p為0,說明為大端模式。

參考資料

相關推薦

大端(big endian little endian)

讀寫 pue 處理器 bsp 網絡 做的 tdi har power 一、大端和小端的問題 對於整型、長整型等數據類型,Big endian 認為第一個字節是最高位字節(按照從低地址到高地址的順序存放數據的高位字節到低位字節);而 Little endian 則相反,它認為

大端(Big endian and Little endian)

tro big ttl class erp 順序 通過 網絡 rpc 1.大端和小端的問題 ? 對於整型、長整型等數據類型,Big endian 人為第一個字節是最高位字節(按照從低地址到高地址的順序存放數據的高位字節到低位字節),而 Little endian 則相反,它

010 大端

ret out 模式 大端模式 小端 str char* main 大端 所謂的大端模式,是指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中; 所謂的小端模式,是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中。 #include "s

【C++】大端的理解

我的理解: 記憶體是以位元組為單位的,一個位元組是8位,也就是2位的16進位制,所以首先將資料轉成16進位制,比如下面例子中的0x12345678,就表示了4個位元組的資料。這裡要注意一點,如果將資料改成0x10,那麼這個還是4個位元組的資料,主要是位元組空間是由int所決定的,因此就

區分大端

如何區分大端和小端? 小端: FF FE開頭                低位元組在前 ,高位元組在後      

網路通訊之 位元組序轉換原理與網路位元組序、大端模式

     原因如下:網路協議規定接收到得第一個位元組是高位元組,存放到低地址,所以傳送時會首先去低地址取資料的高位元組。小端模式的多位元組資料在存放時,低地址存放的是低位元組,而被髮送方網路協議函式傳送時會首先去低地址取資料(想要取高位元組,真正取得是低位元組),接收方網路協議函式接收時會將接收到的第一個位元

輕鬆記住大端的含義(附對大端的解釋)

原文地址:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html   或許你曾經仔細瞭解過什麼是大端小端,也動手編寫了測試手頭上的機器上是大端還是小端的程式,甚至還編寫了大端小端轉換程式;但

大端、hton*ntoh*

1、TCP/IP網路傳輸使用大端的位元組序2、大端小端問題只有在表示的資料型別大於一個位元組的時候存在,對於char、byte型別的資料不需要考慮此問題3、目前大部分CPU都是小端4、如果網路兩端位元組序相同,可以不需要考慮位元組序,接收後直接按照資料型別強轉;如果兩端位元組

大端區別-linux

Little-Endian:低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。 Big-Endian:高位位元組排放在記憶體的低地址端,低位位元組排放在記憶體的高地址端。 記憶方法:

大端

基本概念 我們可以把計算機的記憶體抽像成一個大的陣列,在這個陣列中,包含了一個個的位元組元素。對於大小端的討論,我們可以認為記憶體的最小單元即是一個位元組(byte)。對於每個位元組,我們可以使用一個“索引”來標識,這個索引亦即我們平常所說的記憶體的地址。

大端位元組區別

大端:高位元組存放在低地址,低位元組存放在高地址 小端:高位元組存放在高地址,低位元組存在低 不過給我啟發的是,在裘宗燕翻譯的《程式設計實踐》裡,這對術語並沒有翻譯為“大端”和小端,而是“高尾端”和“低尾端”,這就好理解了:如果把一個數看成一個字串,比如11223344看成

【轉】輕鬆記住大端的含義(附對大端的解釋)

 轉自:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html        或許你曾經仔細瞭解過什麼是大端小端,也動手編寫了測試手頭上的機器上是大端還是小端的程式,甚至還編寫了大端小端轉換程式;

大端的區別

一、大小端名稱起源        Endian這個詞來源於Jonathan Swift在1726年寫的諷刺小說"Gulliver's Travels"(《格利佛遊記》)。該小說在描述Gulliver暢遊小人國時碰到了如下的一個場景。有一次因為對水煮蛋該從大的一端(Big-

java 大端轉換

1.把小端資料轉換成int int i = ByteBuffer.wrap(fourBytes).order(ByteOrder.LITTLE_ENDIAN).getInt(); 2.把大端資料轉換成int int j = ByteBuffer.wrap(fourByte

大端的判斷及轉換

當前的儲存器,多以byte為訪問的最小單元,當一個邏輯上的地址必須分割為物理上的若干單元時就存在了先放誰後放誰的問題,於是端(endian)的問題應運而生了,對於不同的儲存方法,就有大端(big-endian)和小端(little- endian)兩個描述。 位元組排序按分

深入理解計算機系統-之-數值儲存(一)-CPU大端模式詳解

大端與小端 在嵌入式開發中,大端(Big-endian)和小端(Little-endian)是一個很重要的概念。 MSB與LSB 最高有效位(MSB)指二進位制中最高值的位元。在16位元的數字音訊中,其第1個位元便對16bit的字的數值有最大的

大端模式模式

說明 dia style 得出 nio 特性 所有 訪問 img 1. 為什麽會產生兩種模式: 在計算機中我們是以字節為單位的,每一個地址單元都對應著一個字節,一個字節就是8位,c語言中char類型之外,還 有四個字節的int,個字節的longlong類型,並

位元組序----大端

大端序 (big endian ):最高有效位元組儲存在最低低至,隨地址升高,位元組的權重降低。 小端序(little endian): 最低有效位元組儲存在最低地址,隨地址升高,位元組的權重升高。 比如說一個int型數字a為0x1234,那麼0x12代表a的高位,0x34代表a

通過一句話記住大端序的區別

在軟體開發過程中,軟體開發人員都知道大端序和小端序的概念,但是在真正使用的時候,傻傻分不清兩種到底是怎麼儲存。 首先還是先看下基本概念: 1、大端模式:高位元組儲存在記憶體的低地址 2、小端模式:高位元組儲存在記憶體的高地址 舉例: var = 0x11223344,對於這個變數

[C/C++]_[初級]_[大端序理解]

場景 在進行Socket通訊時, 因為網路位元組序是 Big-Endian模式(標準), 而大部分Windows系統都是 Little Endian模式, 所以在傳輸數值型別的資料時, 需要把 Little Endian的記憶體資料轉換為 Big-Endian再發送.