大小端問題

2021-09-13 02:05:55 字數 872 閱讀 1704

1、大小端問題的由來

在計算機記憶體中,通常是以位元組(byte),也就是 8 個位(bit)為基本儲存單元(也有以 16 位為基本儲存單元的)。

對於像c++中的char這樣的資料型別,占用乙個位元組的大小,不會產生什麼問題。

但是當資料型別為int,在32bit的系統中,它需要占用4個位元組(32bit),這個時候就會產生這4個位元組在暫存器中的存放順序的問題。比如int maxheight = 0x12345678,&maxheight = 0x0042ffc4。具體的該怎麼存放呢?這個時候就需要理解計算機的大小端的原理了。

【注】不管是大端法還是小端法儲存,計算機在記憶體中存放資料的順序都是從低位址到高位址,所不同的是首先取低位元組的資料存放在低位址還是取高位元組資料存放在低位址。

大端法和小端法指的是位元組在記憶體中儲存時的排列規則,而不是資料中的位的排列規則。也有以位序排列的機器,但很少見。另外,再次明確一下,大端法或小端法是資料在儲存時的表現,而不是在暫存器中參與運算時的表現。

我們常用的x86結構都是小端模式,而大部分dsp,arm也是小端模式,不過有些arm是可以選擇大小端模式。所以對於上面的maxheight是應該以小端模式來存放,具體情況請看下面兩表。

(1)小端規則

(2)大端規則

通過上面的**,可以看出來大小端的不同。(注:其實在計算機記憶體中並不存在所謂的資料型別,比如char,int等的。這個型別在**中的作用就是讓編譯器知道每次應該從那個位址起始讀取多少位的資料,賦值給相應的變數。)

大小端問題

對於位數大於 8位的處理器,例如 16位或者 32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如乙個 16bit 的short型x 在記憶體中的位址為 0x0010,x 的值為0x1122 那麼0x11 為高位元組...

大小端問題

大小端問題 跨位元組位域大小端轉換例項講解 注 結構體整體當做u16 u32來賦值時才會產生這種問題,如果是按位元組或者移位方式訪問則沒有問題 typedef struct s bit sample 測試程式 vos void bigendiandomainfiledtest vos void 1 ...

大小端問題

大小端問題 最近工作中,有兩次遇到大小端問題,所以花時間寫這篇日誌,總結一下。1.實際需求 1 前段時間寫了乙個修復損壞的gzip檔案的tool,在linux server上編譯執行沒有問題。但是在solaris server上運編譯執行,結果總是和預期的不一致,跟蹤發現是由大小端問題導致的 2 最...