資料儲存 CPU的大小端

2021-10-13 22:59:20 字數 2681 閱讀 4607

說人話:

在日常生活中,我們在稿紙上寫乙個 10 進製的數字,例如 「2233」:

是個人類,應該都是:

從左向右

先寫 22,再寫 33

也就是:先把 2233 中,高位的數字寫下來,再把低位的數字寫下來。

好啦,上面,咱介紹的人類 10 進製數字的寫法就是 「大端」 ?

至於 「小端」 嘛,正好跟大端相反,

是從左向右,先寫 33,再寫 22 。

現在回過頭,咱再來看 os 中的大小端問題。

q: 首先明確下,設麼時候會出現大小端問題:

a: 在向資料型別大小大於 1 位元組的記憶體中寫入資料時,會發生。

eg:char 型別 = 1,所以 char 就不存在這種問題

int 型別 = 4,所以 int 就存在這種問題。

為什麼是以 1 位元組為分界線?

咱也不知道嘞 ?

具體的原理涉及到 cpu 處理資料的機制,筆者暫未深究太多 tailan

一下內容主線:【一圖勝千言 ?】

小端寫到這裡,回想起來,在最初知道大小端時,

咱之前有過這樣的乙個疑問:

為什麼上面的程式就可以確定大小端呢?雖然說,是咱自己寫的。但如果說,變數的位址是棧區儲存,位址變化是從高位址向低位址擴充套件。那這個程式不就不嚴謹了嘛?

emmm,不知道,汝有沒有被咱迷惑到,

咱的這個疑問說 「棧區是: 高位址 -> 低位址」 這點是沒有錯。

但是這個 高 -> 低,指的可不是變數空間內部的位址,

而是,不同變數之間的位址變化。

咱舉個栗子:

棧區變數 (高 -> 低)

char a = 1;

char b = 2;

address of a = 0xffff

address of b = 0xfff7

********************==

typedef union test;

test t; t.value = 1;

char b;

// 大端

address of alist[0] = 0xffff || alist[0] = 0

address of alist[1] = 0xfff7 || alist[1] = 1

address of b = 0xffef || b

// 小端

address of alist[0] = 0xffff || alist[0] = 1

address of alist[1] = 0xfff7 || alist[1] = 0

address of b = 0xffef || b

吼吼吼,這回看清楚了吧。

變數的記憶體空間其內部是遞增的奧,這點其實完全可以從我們利用指標進行迭代迴圈陣列時,就可以看出來啦。

one more thing:

大小端的問題,站在現在的時間點上來看,用的最多的地方就是 「網路程式設計」 中。

網路通訊為了遮蔽各個聯網裝置之間的 cpu 大小端資料儲存格式不一致問題,強制性的將在網路中傳輸的資料定義為 「大端」 格式,

所以,咱在進行網路程式設計時會進行一步資料格式轉換的操作。

哦對了,還記得咱在前面說到的,

大小端只存在於 資料型別大小大於 1 的資料型別之中,

也就是說,char 完全不受 大小端的約束!

同時,咱進行的 「網路程式設計」 這個玩意兒,傳輸的東西就是 char ?

所以,嚴格的說的話,

網路程式設計中真正需要進行大小端格式處理的,也就只有

struct sockaddr_in seradd;

seraddr.sin_port = htons(2233);

之中會用到啦

#include

uint32_t htonl

(uint32_t hostlong)

;

uint16_t htons

(uint16_t hostshort)

;uint32_t ntohl

(uint32_t netlong)

;

uint16_t ntohs

(uint16_t netshort)

;

ps:說老實話,htonl() 我基本沒用到過 ?,emmm 可能還是筆者taica

判斷CPU大小端儲存

首先明白big endian和little endian的位元組排序含義 big endian 乙個word中的高位的byte放在記憶體中這個word區域的低位址處。little endian 乙個word中的低位的byte放在記憶體中這個word區域的低位址處。例如 如果我們將0x1234abcd...

CPU的大小端模式

不同體系結構的cpu,資料在記憶體中存放的排列順序是不一樣的。儲存器中對資料的儲存是以位元組 byte 為基本單位的,因此,字 word 和半字 half word 在儲存器中就有兩種次序,分別稱為 大端模式 big endian 和小端模式 little endian 大端儲存模式是指字或半字的最...

判斷CPU的大小端

原文出處 下面的兩個程式均可判斷cpu的大小端問題 int i 1 char p char i if p 1 printf little endian little endian else printf big endian big endian 大小端儲存問題,如果小端方式中 i佔四個位元組的長度...