<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大端還是小端?

    Posted on 2006-11-07 13:29 nemo 閱讀(4858) 評論(4)  編輯  收藏

    今天研究SHA-1算法源碼,發現注釋中一個詞怎么也搞不懂:Big-Endian. 在網上查了才知道是大端在前的意思。在http://blog.vckbase.com/smileonce/archive/2005/02/22/3202.aspx?和 http://blog.myrice.com/reddenedmaple/archives/50001922.html中有比較多地介紹。但是很亂,我整理了一下,并加入了自己的一些理解。感謝提供信息的人們。

    這兩個術語來自于?Jonathan?Swift?的《《格利佛游記》其中交戰的兩個派別無法就應該從哪一端--小端還是大端--打開一個半熟的雞蛋達成一致。
    在那個時代,Swift是在諷刺英國和法國之間的持續沖突,Danny?Cohen,一位網絡協議的早期開創者,第一次使用這兩個術語來指代字節順序,后來這個術語被廣泛接納了,成為計算機專用名詞。除網絡傳輸之外,在計算機硬件中也有使用,通常表示邏輯最小處理單元大于物理最小處理單元時邏輯單元與物理單元的映射方式。
    由于這個概念第一次提出時是來指代字節順序,而且計算機物理最小處理單元通常為一個字節,所以通常情況下無論是大端還是小端都是以字節(8bit)計,在字節之內都是以大端順序排列。但不排除以后隨著計算機的發展將這個數字擴充。

    字節排序含義
    Big-Endian高位在前,低位在后。
    Little-Endian低位在前,高位在后


    請看下面這個例子:
    如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果為
    ??????????????? big-endian???? little-endian
    0x0000???? 0x12????????????? 0xcd
    0x0001???? 0x34????????????? 0xab
    0x0002???? 0xab????????????? 0x34
    0x0003???? 0xcd????????????? 0x12

    然后,假如需要從內存中取32位整數0x1234abcd中的高16位整數,就需要知道是不是big-endian,如果是,需要從0x0002地址中去取,如果是little-endian,則需要從0x0000中取。也即怎么存就怎么取。

    為什么會出現這樣的情況呢?為什么要有這兩種方式來排列數據?我們可以看看Dr. William T. Verts所作的說明:

    Which?is?Better?

    You?may?see?a?lot?of?discussion?about?the?relative?merits?of?the?two?formats,?
    mostly?religious?arguments?based?on?the?relative?merits?of?the?PC?versus?the?Mac.?
    Both?formats?have?their?advantages?and?disadvantages.

    In?"Little?Endian"?form,?assembly?language?instructions?for?picking?up?a?1,?2,?4,?or?longer?byte?number?proceed?
    in?exactly?the?same?way?for?all?formats:?first?pick?up?the?lowest?order?byte?at?offset?0.?
    Also,?because?of?the?1:1?relationship?between?address?offset?and?byte?number?(offset?0?is?byte?0),?
    multiple?precision?math?routines?are?correspondingly?easy?to?write.

    In?"Big?Endian"?form,?by?having?the?high-order?byte?come?first,?
    you?can?always?test?whether?the?number?is?positive?or?negative?by?looking?at?the?byte?at?offset?zero.?
    You?don't?have?to?know?how?long?the?number?is,?nor?do?you?have?to?skip?over?any?bytes?to?find?the?byte?containing?the?sign?information.?
    The?numbers?are?also?stored?in?the?order?in?which?they?are?printed?out,?so?binary?to?decimal?routines?are?particularly?efficient.

    翻譯如下:
    你可能看見過很多關于這兩種形式的相對優點的討論,最激烈的爭論是關于PC和MAC的相對優點。這兩種形式都有其優點和缺點。

    在“小終結者”形式中,提取一個,兩個,四個或者更長字節數據的匯編指令以與其他所有格式相同的方式進行:首先在偏移地址為0的地方提取最低位的字節,因為地址偏移和字節數是一對一的關系,多重精度的數學函數就相對地容易寫了。

    在“大終結者”的形式中,靠首先提取高位字節,你總是可以由看看在偏移位置為0的字節來確定這個數字是正數還是負數。你不必知道這個數值有多長,或者你也不必跳過一些字節來看這個數值是否含有符號位。這個數值是以它們被打印出來的順序存放的,所以從二進制到十進制的函數特別有效。

    因而,對于不同要求的機器,在設計存取方式時就會不同。
    IBM的370主機,多數基于RISC計算機,和Motorola的微處理器使用big-endian方法。TCP/IP也使用big-endian方法(big-endian方法也叫做網絡編碼)。對于人來說我們的語言都是從左到右的習慣方式。這看上去似乎被認為是自然的存儲字符和數字方式-你同樣也希望以同樣的方式出現在你面前。許多人因此也會認為big-endian是流行的存儲方式,正如我們平時所讀到的。

    然而,Intel處理器(CPUs)和DEC Alphas和至少一些在他們的平臺的其他程序都是little-endian的。對于little-endian有一個問題,那就是如果你增加數字的值,你可能在左邊增加數字(高位非指數函數需要更多的數字)。因此,經常需要增加兩位數字并移動存儲器里所有Big-endian順序的數字,把所有數向右移,這會增加計算機的工作量。不過,使用little-endian的存儲器中不重要的字節可以存在它原來的位置,新的數可以存在它的右邊的高位地址里。這就意味著計算機中的某些計算可以變得更加簡單和快速。

    Feedback

    # 這個我研究過。  回復  更多評論   

    2006-11-08 08:43 by lvcha
    java因為存在虛擬機,所以把底層的大端和小端問題屏蔽了,內部都是小端,恰恰與.net相反,它沒有屏蔽這件事情。
    呵呵,所以他們兩個序列化反序列化需要手工處理一下。java端。

    # re: 大端還是小端?  回復  更多評論   

    2006-11-10 10:36 by nemo
    對。Java等的語言編譯器必須明確他們開發的目標代碼使用的是什么存儲方式。如果有必要,可以使用轉換器可以用來轉換存儲順序。

    # re: 大端還是小端?  回復  更多評論   

    2009-04-04 21:03 by Moto
    反了吧,Big Endian是高位存低址啊。

    # re: 大端還是小端?  回復  更多評論   

    2009-04-04 21:05 by Moto
    哦,沒反。有點暈

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    posts - 21, comments - 74, trackbacks - 0, articles - 3

    Copyright © nemo

    主站蜘蛛池模板: www成人免费观看网站| 美女视频黄频a免费观看| 久久www免费人成看国产片| 亚洲国产成人久久一区久久| 亚洲AV无码资源在线观看| 97无码免费人妻超级碰碰碰碰| 亚洲人成网站18禁止久久影院| 在线观看www日本免费网站| 亚洲综合小说久久另类区| 日本zzzzwww大片免费| 亚洲av无码片区一区二区三区| 一二三四影视在线看片免费 | 99久久免费精品高清特色大片| 亚洲91av视频| 免费观看激色视频网站bd| 亚洲a视频在线观看| 成人免费看片又大又黄| 看Aⅴ免费毛片手机播放| 亚洲真人日本在线| 99re6在线视频精品免费下载 | 久久亚洲国产成人影院| 国产精品免费视频一区| 一级做a毛片免费视频| 亚洲精品无码不卡| 黄页网站在线观看免费高清| 亚洲AV无码AV吞精久久| 亚洲伊人成无码综合网| 99re免费视频| 国产精品久久亚洲一区二区| 国产亚洲大尺度无码无码专线| 日本在线看片免费| 亚洲成AV人片高潮喷水| 亚洲国产精品无码久久久不卡| 91久久成人免费| 国产亚洲精品美女2020久久 | 亚洲人成网站18禁止一区| 日本免费一区二区三区 | 国产老女人精品免费视频| 精品熟女少妇aⅴ免费久久 | 久久丫精品国产亚洲av| 免费的一级黄色片|