1. 程式人生 > >大端模式和小端模式的再理解

大端模式和小端模式的再理解

首先看一段程式:

#include <stdio.h>
int main()
{
    int a = 100; 
    int b = 200;
    int c = 300;
    printf("%p\n",&a);
    printf("%p\n",&b);
    printf("%p\n",&c);
    return 0;
}

看輸出結果:

0x7fff52499ad8 // a
0x7fff52499ad4 // b
0x7fff52499ad0 // c

可以看到,在棧上分配的int資料,記憶體地址是往下增長的。

我以為堆上的地址增長方向是相反的:

    // 堆上儲存
    int *pa = (int*)malloc(sizeof(int));
    int *pb = (int*)malloc(sizeof(int));
    int *pc = (int*)malloc(sizeof(int));

    printf("%p\n",&pa);
    printf("%p\n",&pb);
    printf("%p\n",&pc);

結果發現輸出:

    0x7fff5c5eeac8 // pa
    0x7fff5c5eeac0 // pb
    0x7fff5c5eeab8 // pc

因此,在本機(macos)測試下,堆、棧的分配都是地址遞減,和我想的不太一樣。。

所以只能說概念。

我們假設地址從左往右增長,或者從上往下看增長。不管怎樣,我們就帶著這樣的視角。
按照大端序的說法,大端序裡一個字的高位位元組(左邊)存在記憶體的低地址處。所以,對於一個數字0x12345678, 12是最高位的位元組,因此存在地址的最左邊,因為我們假定了地址從左往右增長,左邊地址最小。 這樣一次進行,所以大端序下看起來非常符合我們的直覺。
因此,稱之為:大自然!

小端序是反著來的,留待各位舉一反一吧。

其實是,這種只有兩種情況的,記住一個的效率高且準確。

以上。

相關推薦

大端模式模式理解

首先看一段程式: #include <stdio.h> int main() { int a = 100; int b = 200; int c = 300; printf("%p\n",&a);

大端模式模式

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

詳解大端模式模式

一、大端模式和小端模式的起源      關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛遊記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大

大端模式模式的判斷及其互相轉化

一.定義 大端模式(Big Endian):資料的高位元組,儲存在記憶體的低地址中;資料的低位元組,儲存在記憶體的高地址中。 小端模式(Little Endian):資料的高位元組,儲存在記憶體的高地址中;資料的低位元組,儲存在記憶體的低地址中。 二.

大端模式模式的區別

端模式,英文j :Endian.該名詞不只是存在於嵌入式之中.在計算機業界,簡單概要的說Endian表示資料在儲存器中的存放順序。下文舉例說明在計算機中大小端模式的區別。  如果將一個32位的整數0x12345678存放到一個整型變數(int)中,這個整型變數採用大端或者小端模式在記憶體中的儲存由下表所示。

詳解Big-EndianLittle-Endian,大端模式模式

詳解大端模式和小端模式 一、大端模式和小端模式的起源         關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛遊記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋

大端模式模式的起源

        關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛遊記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋,按這種方法把手指弄

計算機大端模式模式 記憶體對齊問題(sizeof)

一、大端模式和小端模式的起源         關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛遊記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於

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

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

大端模式模式C#反轉

iou name 通過 緩存 .net new mark 要求 boa A、C#大端模式和小端模式。 小端(little-endian)模式:低地址上存放低字節,高地址上存放高字節。 如0x11223344→ byte[] numBytes = new byte[]{ 0x

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

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

大端模式模式

abcde 輸出 stdlib.h rto bcd lib 字符 小端 const Big-Endian和Little-Endian的定義如下: 1) Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。 2) Big-Endi

簡述大端模式模式

大端模式與小端模式 由來 在C語言資料型別除char為8位外,還有16位,32位,64位等。那麼對於16位或者32位的處理器,一次處理的多於8位,所以要對位元組排列組合一下。也就有了大端儲存格式和小端儲存格式。 儲存格式 大端儲存(Little-endian)格式: 在這種模式中,字資料的高位元

如何判斷機器CPU是大端模式還是模式

說明:這裡面涉及到本機位元組序和網路位元組序的概念。A (本機位元組序) ---- 網路位元組序 ----B(本機位元組序),其中本機位元組序就是指機器是大端還是小端,網路位元組序,我們都知道網路中會將內容封裝成流,比如TCP/IP或者是 ISO,網路位元組序是大端模式。引用網上的一張關於大小端的圖

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

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

大端模式模式、網路位元組順序與主機位元組順序(經典)

大端模式與小端模式 一、概念及詳解   在各種體系的計算機中通常採用的位元組儲存機制主要有兩種: big-endian和little-endian,即大端模式和小端模式。   先回顧兩個關鍵詞,MSB和LSB:   MSB:Most Significant Bit ---

大端模式模式

舉一個例子,比如數字0x12 34 56 78在記憶體中的表示形式為: 1)大端模式: 低地址 -----------------> 高地址 0x12  |  0x34  |  0x56  |  0x78 2)小端模式: 低地址 ----------------

C語言判斷資料儲存時大端模式還是模式

用C語言寫程式時需要知道是大端模式還是小端模式。所謂的大端模式,是指資料的低位儲存在記憶體的高地址中,而資料的高位,儲存在記憶體的低地址中;所謂的小端模式,是指資料的低位儲存在記憶體的低地址中,而資料的高位儲存在記憶體的高地址中。為什麼會有大小端模式之分呢?這是因為在計算機系

判斷大端模式還是模式

#include <stdio.h>int main (int argc, char **argv){    int a = 0x12345678;    char b;    b = (((unsigned char *)&(a))[0]);    i

位元組序----大端

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