大小端模式詳解及其測定

大小端的寓言故事

有關大小端的爭論,最早來自於《格列夫遊記》裏一個有趣的故事:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章