Posted on 2008-07-30 14:48
Fox 閱讀(2031)
評論(4) 編輯 收藏 引用 所屬分類:
T技術碎語
一、Big-endian & Little-endian
還是Wikipedia好啊!可惜中文的國內看不了,愚昧啊!實在覺得中文有點難懂,看看日本語版本吧:D!
關于端(endianness)的介紹,Wikipedia上比較全了:http://en.wikipedia.org/wiki/Endianness
關于網絡字節序(network byte order)和主機字節序(host byte order),說來挺無關緊要的一點東西,因為每次總是忘掉,所以每次都要好奇的看看大端(big-endian)和小端(little-endian)。
給定unsigned long
型整數十六進制形式:0x0A0B0C0D,其big-endian和little-endian形式分別為:
1) Big-endian
Memory
| ... | 8-bit atomic element size | ... | 16-bit atomic element size
| 0x0A | a | 0x0A0B | a
| 0x0B | a+1 | 0x0C0D | a+1
| 0x0C | a+2
| 0x0D | a+3
| ... |
2) Little-endian(X86)
Memory
| ... | 8-bit atomic element size | ... | 16-bit atomic element size
| 0x0D | a | 0x0C0D | a
| 0x0C | a+1 | 0x0A0B | a+1
| 0x0B | a+2
| 0x0A | a+3
| ... |
Mapping registers to memory locations (from Wikipedia)
為什么X86存儲會使用little-endian,起初我想對于位運算,尤其是位移運算,little-endian很方便,但轉念一想,big-endian也方便啊,無非是左移和右移的區別而已,但little-endian的優勢在于unsigned char/short/int/long類型轉換時,存儲位置無需改變。
在網絡傳輸中,采用big-endian序,對于0x0A0B0C0D,傳輸順序就是0A 0B 0C 0D,因此big-endian作為network byte order,little-endian作為host byte order。
________________________________________________
PS:做雞有什么不好?
上午跟某同事(為尊重慮,下文以Y稱之)躲在犄角旮旯抽煙。以下為場景再現:
(忽然整出來一句)Y:聽過鷹的故事沒有?
(滿臉疑惑)Fox:沒有。
Y:一只小鷹掉到雞窩里,#$@%……
F:我不是鷹,我就是一只雞,做技術雞有什么不好?
Y:做技術沒有不好啊……
F:我不是說做技術,我說做雞,我就是在地上走的,我為什么總是要抬頭看天?
Y:你要往上看,沒有人注定不能飛,XX以前也沒有想過有一天會飛起來。
F:我不是掉到雞窩里,我本來就在雞窩里,我也喜歡呆在雞窩里,別人都在地上走,我為什么要飛起來?
Y:你總要飛起來。
F:我說了我喜歡呆在雞窩里,你見過有那只雞飛起來了?
Y:……
F:我就是一只雞,插了雞翅還是飛不起來,況且,我對飛起來也沒有任何興趣。
Y:……
F:做雞有什么不好?
Y:你看老毛,與人斗其樂無窮,他境界多高,與天斗其樂無窮,知道吧,他已經不屑與人斗了。
F:我不喜歡與人斗,我也斗不過,做雞有什么不好?
Y:……