1. 程式人生 > >對於字節順序——大端與小端的理解

對於字節順序——大端與小端的理解

image 應該 產生 出錯 混合 nat 轉換 位置 字符串

之前我對大小端的理解是數據存放方式不同,最近在讀《計算機組成-結構化方法》一書時發現,並不是存放方式不同,而是字節地址的編排方式不同,換句話說,存的位置都是一樣的,只不過這個位置因為編址方式的不同使得它的地址編號不同,也因此產生了大小端問題。下面的理解均是我個人對於《計算機組成-結構化方法》第六版2.2.3節的理解,建議大家看原書。
首先,大端與小端這兩個名詞出自英國作家Jonathan Swift,他在《格列夫遊記》一書中將這兩個詞用來諷刺那些因為爭論打雞蛋時應該打破大端還是小端而引發一場戰爭的政治家們。
每八位存儲單元組成了一個字節,一定數量的字節組成字,這個一定數量由處理器決定,如果是32位處理器,那麽一個字(32位字)就是4字節,64位處理器,一個字(64位字)是8字節。每個字中的字節地址可以從左到右或從右到左編排。如圖a,是從左到右排列(大端),圖b是從右到左排列(小端)。
技術分享


不管是大端還是小端,用來表示一個32位整數時,比如說6,都是在最右邊的(最低位)3位上存放6的二進制值110,前面的29位都是0,換句話說,在大端派的計算機中,有110這三位的應該是字節3(或者是7、11、15),而在小端派計算機中是字節0(或者是4、8、12)中。
如果計算機只用來存放整數,那麽不會有任何問題。然而,許多應用中要存放的是整數、字符串和其他數據類型的混合結構。例如,我們要在計算機中存放一個由一個字符串(名字)和兩個整數(年齡和編號)組成的簡單的員工記錄。如圖a、b分別給出了用大端派和小端派計算機表示同一個員工Jim Smith(年齡21、編號260)的不同存儲方式。
技術分享
兩種表示方式都沒有問題,但是當一臺計算機要從網絡上向另一臺計算機發送這個數據時,就有問題了。嘉定從大端派計算機向小端派發送上面的數據,每次一個字節,從字節0一直到字節19。即大端派的字節0送到小端派的字節0,一次下去。如圖c
技術分享

對比圖b會發現數據出錯了,名稱沒有問題,但是年齡和編號變了,換句話說傳輸過程中按照字節對應傳輸,對於字符串沒有問題,但是對於年齡和編號等整數就不對了。如果只是簡單的將傳遞過來的數據反轉,將會出現圖d的情況。
技術分享
對比圖b發現,年齡和編號對了,但是名稱會變成"MIJTIMS",最後的"H"會因為前面的0而無法輸出。這個問題沒有簡單的解決辦法。可行但不太全面的一條途徑是在每個數據項前面加上一個頭來描述其後的數據類型和數據長度,使接收方可對數據進行必要的轉換。

對於字節順序——大端與小端的理解