或許你曾經仔細了解過什麼是大端小端,也動手編寫了測試手頭上的機器上是大端還是小端的程式,甚至還編寫了大端小端轉換程式;但過了一段時間之後,當你再看到大端和小端這兩個字眼,你的腦中很快浮起了自己曾經做過的工作,卻總是想不起究竟哪種是大端、哪種是小端,然後又去查以前寫的記錄?更讓人不快的是,這種經歷反反覆覆,讓你十分困擾。如果你和以前的筆者一樣,有過這種不快的經歷,那麼這篇文章希望能幫你徹底解決這個苦惱,讓你徹底記住它們。
如果你在工作中經常使用到大端和小端以至於對它們十分熟悉,或者你的記憶力在保持時間的長度和精準度上都十分優秀,以至於不需要借助其他的方法,那麼這篇文章不適合你。
現在先來理解這對概念,大端和小端這兩個令人迷惑的術語究竟是如何產生的?《程式設計實踐》第9章中提到,「大端」和「小端」可以追溯到2023年的jonathan swift的《格列佛遊記》,其中一篇講到有兩個國家因為吃雞蛋究竟是先打破較大的一端還是先打破較小的一端而爭執不休,甚至爆發了戰爭。2023年10月,danny cohen的文章《論聖戰以及對和平的祈禱》(on holy wars and a plea for peace)將這一對詞語引入了計算機界。這麼看來,所謂大端和小端,也就是big-endian和little-endian,其實是從描述雞蛋的部位而引申到計算機位址的描述,也可以說,是從乙個俚語衍化來的計算機術語。稍有些英語常識的人都會知道,如果單靠字面意思來理解俚語,那是很難猜到它的正確含義的。在計算機裡,對於位址的描述,很少用「大」和「小」來形容;對應地,用的更多的是「高」和「低」;很不幸地,這對術語直接按字面翻譯過來就成了「大端」和「小端」,讓人產生迷惑也不是很奇怪的事了。
不過給我啟發的是,在裘宗燕翻譯的《程式設計實踐》裡,這對術語並沒有翻譯為「大端」和小端,而是「高尾端」和「低尾端」,這就好理解了:如果把乙個數看成乙個字串,比如11223344看成"11223344",末尾是個'\0','11'到'44'個占用乙個儲存單元,那麼它的尾端很顯然是44,前面的高還是低就表示尾端放在高位址還是低位址,它在記憶體中的放法非常直觀,如下圖:
「高/低尾端」比「大/小端」更不容易讓人迷惑。但是根據個人經驗,在市面上的書籍、網路上的各種資料中,很遺憾,前者已經很少見了,多見的是後者。好在這兩對形容詞中,恰好「高」和「大」對應,「低」和「小」對應;既然高尾端對應的是大端,低尾端對應的是小端,那麼當你再見到大端和小端這一對術語,就可以在腦中把它們轉化成高尾端和低尾端,這時憑著之前的理解,甚至不用回憶,想著高低的字面含義就能回想起它們的含義。但是很奇怪的是,同樣是裘宗燕翻譯的《程式設計原本》(elements of programming),卻把big-endian翻譯成大尾格式(第一章)。
理解之後,總結一下,記憶的方法是:
(資料看成字串)大端——高尾端,小端——低尾端稍一思索什麼是「高」、什麼是"低","尾端"又是什麼,問題迎刃而解,再不用擔心被「大端」和「小端」迷惑。用這種方式,是時候放棄原先的死記硬背和容易把自己繞進去而發生迷惑的理解了。
附錄:什麼是「大端」和「小端」及一段測試本機大端還是小端的**
(這段文字是《unix網路程式設計·卷一》的關於這個概念的概括;不僅限於這本書,很多計算機書籍都是這麼介紹這個概念的,你會在和計算機相關不同領域的書中遇到它們。儘管很令人疑惑,但是在閱讀正文前,你最好對這兩個詞語的概念有所理解。當然,如果你以前向正文中描述的一樣接觸過它們,那就不必讀這一部分了。讀完後你會發現,你雖然理解了含義,但很容易忘掉,這時你就可以看正文部分了)
對於乙個由2個位元組組成的16位整數,在記憶體中儲存這兩個位元組有兩種方法:一種是將低序位元組儲存在起始位址,這稱為小端(little-endian)位元組序;另一種方法是將高序位元組儲存在起始位址,這稱為大端(big-endian)位元組序。
在圖中,頂部表明記憶體位址增長方向從右到左,在底部標明記憶體位址增長的方向為從左到右。並且還標明最高有效位(most significant bit,msb)是這個16位值最左邊一位,最低有效位(least significant bit, lsb)是這個16位值最右邊一位。術語「小端」和「大端」表示多個位元組值的哪一端(小端或大端)儲存在該值的起始位址。
這兩種位元組序沒有標準可循,都有系統在使用。把某個給定系統所用的位元組序稱為主機位元組序,可以用以下程式輸出主機位元組序。方法是在乙個短整數變數中存放2位元組的值0x0102,然後檢視它的連續位元組c[0](對應上圖位址a)和c[1](對應上圖位址a+1),以此確定位元組序。
#include #include int main(int argc, char **ar**)
un;un.s = 0x0102;
if(sizeof(short)==2) else
printf("sizeof(short)= %d\n",sizeof(short));
exit(0);
}
出處: mysql 大小端 大小端定義
大小端的定義 big endian和little endian的定義如下 little endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。big endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。舉乙個例子,比如數字0x12 34 ...
大小端的問題 什麼是大小端和如何實現大小端)
1.什麼是大小端?1 大端 big endian 資料的高位元組存放在記憶體的低位址中,而資料的低位元組存放在記憶體的高位元組中。高低大 2 小端 little endian 資料的高位元組存放在記憶體的高位址中,而資料的低位元組存放在記憶體的低位元組中。高高小 下面以unsigned int va...
機器的大小端
用c語言寫程式時需要知道是大端模式還是小端模式。所謂的大端模式 be big endian 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 低對高,高對高 最直觀的位元組序,因為不要考慮對應關係 只需要把記憶體位址從左到右按照由低到高的順序寫出,把值按照通常的高位到低位的...