測試本機的大小端模式

2021-06-19 10:23:08 字數 2961 閱讀 3190

1. 什麼是大小端模式?區別?  (小端儲存模式和大端儲存模式)

如數字0x1234,低位元組位是0x34,高位元組位是0x12。 假設從位址0x4000處開始存放

記憶體位址         小端模式(little-endian)       大端模式(big-endian)

0x4000           0x34                                  0x12

0x4001           0x12                                  0x34

big-endina, 資料型別中的高位資料存放於記憶體的位址部分,低位資料存放於記憶體的低位址部分!

採用little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組,

而big-endian模式對運算元的存放方式是從高位元組到低位元組。

計算機世界中借用大小端指「多位元組資料型別中的位元組順序」。

注:不管是大端還是小端,cpu總是從記憶體的低位到高位讀取資料

每乙個記憶體單元都是8位,對應1位元組!

2. 各自的優缺點?

沒有誰優誰劣之分,各自的優勢便是對方的劣勢!

大端模式:符號位在第一位元組,容易判斷正負!

小端模式:???

3. 大小端之分產生的原因?

大小端模式是位元組序不同......(待補充)

計算機世界中借用大小端指「多位元組資料型別中的位元組順序」。

4. 陣列在大小端模式下的儲存

以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其儲存情況,

我們可以用unsigned char buf[4]來表示value:

big-endian: 低位址存放高位,如下:         little-endian: 低位址存放低位,如下:

高位址---------------

buf[3] (0x78) -- 低位                                   buf[3] (0x12) -- 高位

buf[2] (0x56)                                               buf[2] (0x34)

buf[1] (0x34)                                               buf[2] (0x34)

buf[0] (0x12) -- 高位                                   buf[0] (0x78) -- 低位

低位址---------------

5. 大小端模式的具體應用

比如某協議規定了資料按大端模式(big-endian)組織,而實現協議的系統是小端模式(little-endian), 那麼協議的實現**就需要對輸入資料從(big-endian)轉換為(little-endian),再進行運算, 輸出資料也要從(little-endian)轉換為(big-endian)。

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

通過對大小端的儲存原理分析可發現,對於 char 型資料,由於其只佔乙個位元組,所以不存在這個問題,這也是一般情況下把資料緩衝區定義成 char 型別 的原因之一。對於 ip 位址、埠號等非 char 型資料,必須在資料傳送到網路上之前將其轉換成大端模式,在接收到資料之後再將其轉換成符合接收端主機的儲存模式。

linux

系統為大小端模式的轉換提供了 4 個函式,輸入 man byteorder 命令可得函式原型

htonl 表示 host to network long ,用於將主機 unsigned int 型資料轉換成網路位元組順序; 

htons 表示 host to network short ,用於將主機 unsigned short 型資料轉換成網路位元組順序; 

ntohl、ntohs 的功能分別與 htonl、htons 相反

6. 判斷本機大小端模式的方法

思路1:如乙個unsigned int a = 0x 1234; 把a轉換成unsigned char (單位元組),unsigned char *b = (unsigned char *)&a;

因為b(字串首位址,第乙個位址)表示整個字串,所以只需判斷b[0] 是否等於0x34就知是否是小端模式!

#define u16 unsigned short;

#define u8  unsigned char;

int islittleendian()

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

typedef enum  bool;

bool isbigendian()

num;      

num.a = 0x1234;

if( num.b == 0x12 )

return true;

return false;        //return (num.b == 0x12);

}

7. 大小端模式之間的轉換!

(待補充)

8.常見的位元組序

一般作業系統都是小端,而通訊協議是大端的。

補:十六進製制數,以0x開始,這裡的0是數字0,不是字母o!       

我們為什麼常用十六進製制數呢?計算機中所有的資料都是以二進位制的形式儲存的,有時用二進位制我們可以直觀的解決問題。

但是二進位制表示數太長,如int a = 3; 用二進位制表示 0000000  00000000 00000000  00000011 面對這麼長的數進行思考或操作,沒有人會喜歡。

因此,c,c++ 沒有提供在**直接寫二進位制數的方法。用16進製制或8進製可以解決這個問題。

大 小端模式的測試

大端模式 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 小端模式 是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其...

大 小端模式的測試

大端模式 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。嵌入式系統開發者應該對little endian和big end...

大 小端模式的測試

大端模式 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。嵌入式系統開發者應該對little endian和big end...