大小端 位元組序與位元序

2021-06-22 05:06:44 字數 1236 閱讀 8268

前兩天被問到乙個關於大小端的問題,很久沒接觸,回答的支支吾吾,說到底還是自己對這個了解的不徹底,今天補上。

這裡明確下,大小端包括位元組序和位元序。他們的概念其實也是類似的,區別就如同他們名字,最小排序單位分別是位元組與位元。如果不是做晶元或者網路、通訊協議,搞計算機的一般都不涉及也不關心位元序。

關於大小位元組序或位元序的定義,這裡不多做說明。記住一句話,「高高低低是小端「就夠了,即高位位元組(位元)在高位址,低位位元組(位元)在低位址。

對於位元序來說,位元字段應該以位元組為邊界,這裡面就涉及乙個關於位結構(又稱位域)的問題。

一般位結構的定義在協議報頭結構體中很常見,比如tcp,ip報頭,linux中tcp.h中報頭定義如下:

struct tcphdr ;
通過大小端中位成員的對比,看以看出些端倪了,以下對位結構補充下說明,自己以後也能多注意下。

注意說明:

struct testa
struct testb 

struct testc

然後,回到剛才tcp報頭結構的定義。這裡有個c語言的知識點,需要說明下:ansi-c標準中的struct結構裡面,結構成員從低位址開始,亦即排在前面的成員位址比後面的成員位址低下。同樣的道理,對於位成員來說,他們在乙個位元組內從低位開始。(在linux下,直接列印位成員的位址,編譯是會報錯的,錯誤顯示:cannot take address of bit-field "***" ,這裡可以利用union的方式去看,網上例項很多)。

也就是因為這個原理,在上面tcp報頭定義中,就必須按照大小端的要求,重新定義位成員的在結構中順序。這裡還需要注意一點,無論大端小端,在乙個給定位址上,機器顯示給我們的值一定是一樣的。比如上面tcp結構中,res1和doff兩個字段成員組成乙個位元組(僅僅用以舉例子說明),假設該位元組的內容是0x12,小端格式中,低址res1中值為0x2,高址doff值為0x1;大端格式中,低址doff值為0x1,高址res1值為0x2,也就體現了結構定義成員順序的意義。但是,無論如何,我們看到的值都是0x12,不可能存在0x21或者別的值。這也就是不涉及晶元或者協議的開發人員不需要關心位元序的道理了。

不知道說的明不明白,靜下來想一想很簡單,切忌浮躁與想當然~

大小端位元組序

1.大端和小端問題 大小端位元組序與硬體有關 intel x86 都是小端位元組序 總結 大端是 按照正常我們書寫的順序來儲存的 小端是 按照我們書寫順序相反的 實現 include int main putchar n printf x n a return 0 檢視輸出結果,判斷大小端位元組序 ...

位元組序 大小端

計算機的基本儲存單元是8位單位元組。多位元組資料,如4位元組的整型資料如何儲存的呢?是高位在記憶體高位元組?還是低位在記憶體高位元組?即位元組是按如何順序存放的?也就是所謂的位元組序,按照存放順序分為大端序 big endian 和小端序 little endian 記憶體位址訪問是由低位址到高位址...

大小端位元組序

計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 比如十六進製制數0x0102,十六進製制每個數字佔4bit,四個數字16bit,也就是2byte,2個位元組儲存。0x0102高位位元組是0x01,低位位元組是0x02。l大端位元組序 高...