一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

輕松記住大端小端的含義(附對大端和小端的解釋)

 橙zc 2015-07-03

  或許你曾經仔細了解過什么是大端小端,也動手編寫了測試手頭上的機器上是大端還是小端的程序,甚至還編寫了大端小端轉換程序;但過了一段時間之后,當你再看到大端和小端這兩個字眼,你的腦中很快浮起了自己曾經做過的工作,卻總是想不起究竟哪種是大端、哪種是小端,然后又去查以前寫的記錄?更讓人不快的是,這種經歷反反復復,讓你十分困擾。如果你和以前的筆者一樣,有過這種不快的經歷,那么這篇文章希望能幫你徹底解決這個苦惱,讓你徹底記住它們。 

  如果你在工作中經常使用到大端和小端以至于對它們十分熟悉,或者你的記憶力在保持時間的長度和精準度上都十分優(yōu)秀,以至于不需要借助其他的方法,那么這篇文章不適合你。

  如果你在看這篇文章前完全不知道什么是大端和小端,那么可以參考本文的附錄或者其他的博文,相關的介紹非常之多,而附錄提供了一個很常見解釋和一段測試程序,然后再來看正文。

  為了幫助記憶,理解是必要的;而記憶的目的,也就是為什么要記住它,是更重要的。或許你會問,先了解概念,用的時候再查,不行么?其實我之前也是這么認為的。大端和小端這兩個名詞,你會在很多有關網絡編程、系統(tǒng)設計、甚至是代碼寫作的書上看到,而且它也是很多公司的筆試題、面試題熱門內容,可見它在一些領域是很常用。如果等到你用的時候再查,一方面要降低你的工作效率,另一方面,應試的時候也不是你想查就能查的;其實最主要的是,在掌握規(guī)律后,記住它們并不困難。

  現在先來理解這對概念,大端和小端這兩個令人迷惑的術語究竟是如何產生的?《程序設計實踐》第9章中提到,“大端”和“小端”可以追溯到1726年的Jonathan Swift的《格列佛游記》,其中一篇講到有兩個國家因為吃雞蛋究竟是先打破較大的一端還是先打破較小的一端而爭執(zhí)不休,甚至爆發(fā)了戰(zhàn)爭。1981年10月,Danny Cohen的文章《論圣戰(zhàn)以及對和平的祈禱》(On holy wars and a plea for peace)將這一對詞語引入了計算機界。這么看來,所謂大端和小端,也就是big-endian和little-endian,其實是從描述雞蛋的部位而引申到計算機地址的描述,也可以說,是從一個俚語衍化來的計算機術語。稍有些英語常識的人都會知道,如果單靠字面意思來理解俚語,那是很難猜到它的正確含義的。在計算機里,對于地址的描述,很少用“大”和“小”來形容;對應地,用的更多的是“高”和“低”;很不幸地,這對術語直接按字面翻譯過來就成了“大端”和“小端”,讓人產生迷惑也不是很奇怪的事了。

  不過給我啟發(fā)的是,在裘宗燕翻譯的《程序設計實踐》里,這對術語并沒有翻譯為“大端”和小端,而是“高尾端”“低尾端”,這就好理解了:如果把一個數看成一個字符串,比如11223344看成"11223344",末尾是個'\0','11'到'44'個占用一個存儲單元,那么它的尾端很顯然是44,前面的高還是低就表示尾端放在高地址還是低地址,它在內存中的放法非常直觀,如下圖:

  “高/低尾端”比“大/小端”更不容易讓人迷惑。但是根據個人經驗,在市面上的書籍、網絡上的各種資料中,很遺憾,前者已經很少見了,多見的是后者。好在這兩對形容詞中,恰好“高”和“大”對應,“低”和“小”對應;既然高尾端對應的是大端,低尾端對應的是小端,那么當你再見到大端和小端這一對術語,就可以在腦中把它們轉化成高尾端和低尾端,這時憑著之前的理解,甚至不用回憶,想著高低的字面含義就能回想起它們的含義。但是很奇怪的是,同樣是裘宗燕翻譯的《編程原本》(Elements of Programming),卻把big-endian翻譯成大尾格式(第一章)。

  理解之后,總結一下,記憶的方法是:

    (數據看成字符串)大端——高尾端,小端——低尾端

  稍一思索什么是“高”、什么是"低","尾端"又是什么,問題迎刃而解,再不用擔心被“大端”和“小端”迷惑。用這種方式,是時候放棄原先的死記硬背和容易把自己繞進去而發(fā)生迷惑的理解了。

 

附錄:什么是“大端”和“小端”及一段測試本機大端還是小端的代碼

  (這段文字是《UNIX網絡編程·卷一》的關于這個概念的概括;不僅限于這本書,很多計算機書籍都是這么介紹這個概念的,你會在和計算機相關不同領域的書中遇到它們。盡管很令人疑惑,但是在閱讀正文前,你最好對這兩個詞語的概念有所理解。當然,如果你以前向正文中描述的一樣接觸過它們,那就不必讀這一部分了。讀完后你會發(fā)現,你雖然理解了含義,但很容易忘掉,這時你就可以看正文部分了)

  對于一個由2個字節(jié)組成的16位整數,在內存中存儲這兩個字節(jié)有兩種方法:一種是將低序字節(jié)存儲在起始地址,這稱為小端(little-endian)字節(jié)序;另一種方法是將高序字節(jié)存儲在起始地址,這稱為大端(big-endian)字節(jié)序。

  

  在圖中,頂部表明內存地址增長方向從右到左,在底部標明內存地址增長的方向為從左到右。并且還標明最高有效位(most significant bit,MSB)是這個16位值最左邊一位,最低有效位(least significant bit, LSB)是這個16位值最右邊一位。術語“小端”和“大端”表示多個字節(jié)值的哪一端(小端或大端)存儲在該值的起始地址。

  這兩種字節(jié)序沒有標準可循,都有系統(tǒng)在使用。把某個給定系統(tǒng)所用的字節(jié)序稱為主機字節(jié)序,可以用以下程序輸出主機字節(jié)序。方法是在一個短整數變量中存放2字節(jié)的值0x0102,然后查看它的連續(xù)字節(jié)c[0](對應上圖地址A)和c[1](對應上圖地址A+1),以此確定字節(jié)序。

復制代碼
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
    union {
        short s;
        char c[sizeof(short)];
    } un;
    un.s = 0x0102;
    if(sizeof(short)==2) {
        if(un.c[0]==1 && un.c[1] == 2)
            printf("big-endian\n");
        else if (un.c[0] == 2 && un.c[1] == 1)
            printf("little-endian\n");
        else
            printf("unknown\n");
    } else
        printf("sizeof(short)= %d\n",sizeof(short));
    exit(0);
}
復制代碼

  

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美一区二区黑人在线| 成在线人免费视频一区二区| 日韩在线免费看中文字幕| 男人操女人下面国产剧情| 久久99精品日韩人妻| 久久大香蕉精品在线观看| 欧美乱码精品一区二区三| 日本深夜福利视频在线| 欧美精品一区二区三区白虎| 91午夜少妇极品福利| 欧美国产日产在线观看| 丝袜美女诱惑在线观看| 国产中文字幕久久黄色片| 国产成人精品一区二区三区| 美女黄片大全在线观看| 国产精品日韩精品最新| 国语对白刺激高潮在线视频| 欧美不雅视频午夜福利| 成人精品亚洲欧美日韩| 日本不卡一本二本三区| 亚洲专区中文字幕在线| 91亚洲精品国产一区| 一个人的久久精彩视频| 我想看亚洲一级黄色录像| 亚洲熟女乱色一区二区三区| 91久久精品国产一区蜜臀| 欧美日韩中黄片免费看| 亚洲欧洲在线一区二区三区| 性感少妇无套内射在线视频| 亚洲高清欧美中文字幕| 亚洲一区二区三区三区| 国产91人妻精品一区二区三区| 久久re6热在线视频| 果冻传媒精选麻豆白晶晶| 一区二区三区人妻在线| 91欧美亚洲精品在线观看| 日本熟女中文字幕一区| 久久久免费精品人妻一区二区三区 | 日韩精品少妇人妻一区二区| 久久久精品日韩欧美丰满| 中文字幕一二区在线观看|