linux下c語言的大小端

2021-06-07 21:00:29 字數 1841 閱讀 4206

近來在ubuntu下開發c,網路程式設計方面的,遇到網路位元組序,和本地位元組序 大小端的問題。

1、判斷大小端的簡單方法:

#include #include int main(void)

else if(*((char*)&i) == 1)

else

return 0;

}

結果是:(如圖)

當然,windows和ubuntu系統都是little endian 系統。

分析:整形變數 i 在記憶體中佔4個位元組,所以有 32位;下圖中顯示的是:每個位元組是 8 位二進位制的數字,用 2 位十六進製制表示 。所以 0x 0000 0001,表示 32 位 二進位制數字, 是變數 i 在記憶體中的表示。(16進製制的8位表示的是記憶體中的4個位元組)

而指標指向最低位,所以上面的程式可以檢測大小端的問題。

並且如果是大端的話,當前位址加3位 (+ 3)便得到了最末位的數值,末位為 『01』。(下圖中紅筆的指向)

所以有下面的**並且相應的結果是:

#include #include int main(void)

else if(*((char*)&i) == 0)

else

return 0;

}

結果:

即:在 i 的指標,所指向的空間儲存的是:0000 0001 ,高乙個位元組的位置儲存的是 0000 0000,高兩個位元組,和高三個位元組也是 0000 0000。

但是 高四個位元組和低乙個位元組的位置儲存的是 不定的數值。 

2、htonl()和ntohl()方法的學習

#include #include #include #include int main(void)

else if(*((char*)&i) == 0)

else

i = ntohl(i);

printf("%lu \n", i);

printf("%#x \n", i);

printf("%#o \n", i);

i = ntohl(i);

printf("%lu \n", i);

printf("%#x \n", i);

printf("%#o \n", i);

return 0;

}

結果為:

結果分析:

(1)、是把記憶體中的二進位制:  00000000 00000000 00000000 00000001,

按照位元組反轉過來為: 00000001 00000000 00000000 00000000 ,

自然數2的24次方結果為16777216

轉換成十進位制為: 16777216;

轉換成十六進製制為:0x0100 0000;

轉換成八進位制為:o 010 0000 0000。(紅色的0x和o代表是十六進製制和八進位制)

(2)、從兩個方法來看,htonl和ntohl都是實現了反轉;並且經過驗證,上面的ntohl()方法,和htonl()方法,都可以互換;

所以兩個方法內部的實現應該是一樣。

C語言複習 大小端 求大小端

所謂的大端模式,是指資料的高位,儲存在記憶體的低位址中,而資料的低位,儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 例子 0000430 e684 6c4e 0100 1800 53ef 0100 0100 0000 0000440...

C語言 大小端的問題

在計算機中資料一般都先存在記憶體中,拿32位機來說 系統為記憶體的每乙個位置都分配了乙個位址.位址 從0x00000000開始到0xffffffff 也許你的記憶體沒這麼大 那麼對於小端 little endain 來說,資料0x12345678在記憶體中的映像就是這個樣子的 78 0x000000...

C語言 大小端的判斷

在文章的開頭我首先要介紹一下大小端的概念 大端模式 是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記...