大小端的寓言故事
有關大小端的爭論,最早來自於《格列夫遊記》裏一個有趣的故事:
Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋,按這種方法把手指弄破了,因此他的父親,就下令,命令所有的子民吃雞蛋的時候,必須先打破雞蛋較小的一端,違令者重罰。然後老百姓對此法令極爲反感,期間發生了多次叛亂,其中一個皇帝因此送命,另一個丟了王位,產生叛亂的原因就是另一個國家Blefuscu的國王大臣煽動起來的,叛亂平息後,就逃到這個帝國避難。據估計,先後幾次有11000餘人情願死也不肯去打破雞蛋較小的端吃雞蛋。這個其實諷刺當時英國和法國之間持續的衝突。
什麼是大小端
目前普遍採用的是單字節編址方式,即對於每一個字節(8個位)編一個地址編號,這種方式對於單字節數據存儲沒有問題,但多字節的數據存儲會帶來問題,比如:要將整形 0x 87 65 43 21
(佔四個字節)存儲在其起始地址爲 100
處,是將高位 87
存儲在高地址 103 處,還是將 21
存儲在 103 處,這是一個問題。
- 將數據的高位存儲在低地址處的方式稱爲大端模式;
- 相反的,將數據的低位存儲在低地址處的方式稱爲小端模式。
這樣對於 0x 87 65 43 21 就有兩種存儲方式:
大小端的測定
下面給出兩種測試方法(C語言):
- 用一個
char
的指針取得int
的第一個字節, 通過查看char
對應的是int
的高位數據還是低位數據,從而得出結果。代碼如下:
#include <stdio.h>
int main()
{
int i = 0x87654321;
char *cp = (char*)&i;
printf("%d\n", *cp);
return 0;
}
結果如下:
- 通過聯合體的特點:所有成員共享同一內存,來達到測試目的。代碼如下:
#include<stdio.h>
int check()
{
union{
int i;
char c;
}ic;
ic.i = 0x87654321;
return ic.c == 0x21;
}
int main()
{
if (check())
printf("小端模式\n");
else
printf("大端模式\n");
return 0;
}
結果如下:
【作者:果凍 http://blog.csdn.net/jelly_9】