現在我們試探電腦的記憶體設計屬於 Big-Endian 還是 Little-Endian。

如果令 nint 型態的變數, 令 n 的值為 2562 + 2*256 + 3, 則它的位元排列是

00000000000000010000001000000011
將這 32 bits 每 8 bits 組成一個 byte,共應分成四個字元:
00000000 和 00000001 和 00000010 和 00000011
若以無號整數解讀,這四個字元的值應該是
0 和 1 和 2 和 3

CPU 一定會配給連續四個記憶體給 n, 但是這四個記憶體,卻有兩種放置四個 byte 的可能順序。 如果我們一律按照記憶體位址從小到大的順序來講, 則四個記憶體放置的字元可能是

先 00000000 然後 00000001 然後 00000010 最後 00000011
按照這種順序放置的電腦,稱為 Big-Endian (大頭派); 也可能是
先 00000011 然後 00000010 然後 00000001 最後 00000000
按照這種順序放置的電腦,稱為 Little-Endian (小頭派)。

為什麼叫『大頭』派?因為電腦把『大』的位數放在『前面』 (記憶體編號小的就是前面)。 就好像我們寫十進制數字 123 的意思一百二十三 (100 + 20 + 3), 也就是最大位--百位,寫在前面。因此,我們自己屬於『大頭派』。

相反地,如果把『小』的位數放在『前面』,那就是『小頭』派了。 如果有一個民族的文字,把 123 解釋成三百二十一 (1 + 20 + 300), 那他們就是『小頭派』。 阿拉伯文的文字書寫,是從右向左橫寫,但是遇到數字的時候, 卻是跟我們一樣從左向右寫。如果阿拉伯人讀文字與數字的時候, 都是從右向左讀,則他們會先讀到數字的最小位。 在這個意義之下,阿拉伯人是『小頭派』。

以下程式執行上述實驗。它印出變數 n 佔據的四個記憶體, 以及它們分別的值 (以 0 到 255 的無號整數表示)。

/* Program F */
#include
main() {
int n = 256*256+2*256+3;
unsigned char *c;
printf("n = %d\n", n);
c = (unsigned char*) (void*) &n;
printf("n is allocated at\n%11u\t%11u\t%11u\t%11u\n", c, c+1, c+2, c+3);
printf("%11u\t", *c++);
printf("%11u\t", *c++);
printf("%11u\t", *c++);
printf("%11u\n", *c++);
}


執行的報表如下。

Intel
n = 66051
n is allocated at
3221223236 3221223237 3221223238 3221223239
3 2 1 0
Sun
n = 66051
n is allocated at
4026530332 4026530333 4026530334 4026530335
0 1 2 3

我們看到,Intel 的 Pentium CPU 屬於小頭派, Sun 的 Sparc CPU 屬於大頭派。 與 Intel 相容的 AMD CPU 也是小頭派,而大部分其他廠牌的 CPU 都是大頭派。

最後我們講一則有趣的故事。 為什麼字元的排序設計,要叫做大頭或小頭呢? 雖然從前面的解釋,我們看得出意義,但是這背後其實有一個故事。 Big-Endian 和 Little-Endian 並不是計算機工程師定的名稱, 而是英文作家 Jonathan Swift 在將近 300 年前創造的名詞! 這個名詞出現於 Swift 創作的著名小說 "Gulliver's Travels", 中文通常翻譯作《格利佛遊記》或者《大小人國歷險記》或者《小人國歷險記》之類的, 許多讀者大概在童年時期讀過這本書的童話版節譯本。 這部故事書裡,有一個虛構的『小人國』,稱為 Lilliput。 格利佛意外抵達 Lilliput 的時候,該國正在內戰。 內戰分成兩大派系 (沒有派系就沒有內戰):Big-Endian 和 Little-Endian。

Big-Endian 和 Little-Endian 為了一件很可笑的小事而分成派系: Big-Endian (保守派) 堅持要從雞蛋比較大的那一頭敲開蛋殼 (大頭開蛋), 而 Little-Endian (改革派) 堅持要從雞蛋比較小的那一頭敲開蛋殼 (小頭開蛋)。 雞蛋比較大的那一頭叫做 big-end,因此支持大頭開蛋者就叫做 big-endian; 同理,另一派就叫做 little-endian 了。 作者其實可能要藉用這個情節,來諷刺當時在英國的政治與宗教時事。 後來,計算機科學家也在爭吵關於 byte order 的問題: 究竟是把高位的字元放在前面比較好、還是放在後面比較好? 一位當時在美國南加大的計算機科學家 Danny Cohen 在 1980 年 4 月 1 日,發表了標題為 "On Holy Wars and a Plea for Peace" 的文章 (後來在 1981 年刊登於 IEEE 的 Computer 期刊), 把這場計算機科學家的論戰比喻成格利佛在小人國遇見的 Big-Endian 和 Little-Endian 兩派之內戰。 這是非常有趣的譬喻,一直流傳至今,成為這兩種硬體設計理念的正式代名詞。 可見,如果童話書讀得透徹,長大後可以應用在偉大的論證上。

Jonathan Swift (1667--1745) 出生於愛爾蘭, 跟牛頓 (Issac Newton) 一樣是個遺腹子; Swift (通常譯為『斯威夫特』) 比牛頓年輕 25 歲, 雖然是當時英格蘭社會的重要知識份子之一, 但是一生的工作主要在神學與文學方面,不曉得他知不知道牛頓的偉大創作。 Swift 傳世的作品主要有三件,1726 年 (59 歲) 出版了《格利佛遊記》。 航海、發現、內戰、理性主義與宗教意識的對峙, 這些 Swift 時代的主要社會事件, 全都以幻想、諷刺的方式,寫在他的小說裡, 為他的時代留下幽默的見證。

出處:http://libai.math.ncu.edu.tw/bcc16/pool/1.33.shtml

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()