3/14(二)Little Endian Order

  恩好,拖過一天,到底甚麼是 Little Endian Order 呢?就先來說說電腦儲存的方式,從非常簡單的部分來說,人類使用的語言我們稱作自然語言,基本上是有著眾多分類以及複雜的系統所組成,而以目前的架構所組成的電腦或是我們稱之為計算機的東西,看得懂的只有機器碼,也就是 1 與 0 的訊號,若以進制的說法,就是儲存了二進制(Binary)的機器碼,那怎麼轉換成二進制呢?這裡就來簡單說明一下,一般來說有很基本的兩種方式可以把我們所常用的十進制數字轉換成二進制,我稱為以下:
(一)長除法
  我們假設要轉換的數字為 13,我們所要做的即是將除數設定為 2,做法如下:
    13 / 2 = 6 ... 1
    6 / 2 = 3 ... 0
    3 / 2 = 1 ... 1
    1 / 2 = 0 ... 1
  以最下方的 1 為 MSB(最大位元),最上方的 1 為 LSB(最小位元),依照順序列出即為:1101 b(b 表示二進制),而此串數字即為 13 於二進制系統中的表示方法,若是用八個位元來看,即為 0000 1101 b。
(二)二的乘幕
  這種方式比較適合對於二的乘幕較熟悉的人來使用,在此我們也用 13 為所求之十進制數字,如先從 2 的乘幕來看(以八個位元為例):
  2^7 = 128|2^6 = 64|2^5 = 32|2^4 = 16|2^3 = 8 |2^2 = 4|2^1 = 2|2^0 = 1
     128 64 32 16 8 4 2 1
若用八個位元的二進制來對照:
      0 0 0 0 0 0 0 0
  聰明如妳(你)這時候一定看得出來,13 可以被拆解成 8 + 4 + 1,若我們在有的數字部分,改為 1,如果用上表來對照,即可得:
      0 0 0 0 1 1 0 1
  則我們的答案即為 13 (10) = 0000 1101 b。
  以上為二進制的基本介紹,雖然二進制是電腦所用的數字系統,但對我們,二進制並不是一個很有效表示數字的方式,舉例要表示 1000 這個數字,用十進制我們只需要 4 個位元,但用二進制我們就需要 10 個位元( 2^10 = 1024 )。因此,為了更容易表達電腦的指令和數據,我們會用「十六進制」(Hexadecimal;hex),而轉換方式如上述兩種方式即可,只是將除 2 換成除 16。另外,需要特別注意的部分在於,在十六進制中,10 ~ 15 的數字我們會用 A ~ F 來替代。
  而其實二進制與十六進制之間,有更快速且直接的方式進行轉換,這裡直接就舉例說明比較快:假設現在有一個二進制數字為 00101101 b = 45 (10)
      0 0 1 0 1 1 0 1
  則十六進制的表示方式為 2D h,為何可以快速看出呢?因為十六本身就是二的乘幕數(2^4 = 16),也就是說我們可以透過以每四個位元為一組的方式,快速得知於十六進制中的答案。以上方為例如果只看前四位元,即是二進制中的 2,若看後四位元,就是 15,那這兩個數字在十六進制中的表示方法,即是 2D h,
-------------------------------------------------------------------------------------------------------
  以上我們學習到了二進制的轉換法,那這跟 Little Endian Order 有三小關係呢?還記得剛剛提到電腦都是儲存二進制嗎?我們以下圖來表示電腦的儲存空間
      | 0 0 0 0 0 0 0 0 |(每一欄位皆為 1 byte = 8 bits)
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
  而我使用組合語言中的變數型態來說明接下來要說的部份,先舉例幾個變數型態以及其佔用空間,分別為 BYTE = 1 byte、WORD = 2 bytes 以及 DWORD = 4 bytes,通常我們在使用記憶體空間前,都必須事先宣告一個記憶體位置,而上述的型態,即是告訴電腦我們需要多大空間的方法,例如組語中的變數宣告方式為:
    value[變數名稱] BYTE[變數型態] 87 H[初始值]
  上述宣告,在記憶體中的表現即是:
    value| 1 0 0 0 0 1  1  1  |(每一欄位皆為 1 byte = 8 bits)
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
   這是宣告類型為 BTYE 的結果,但若型態為 WORD 或是 DWORD 呢?例如:
    value2 WORD 587 H
 或  value3 DWORD 9487 H
  這時候就回到我們的標題了,若參考此網址中對於 Big and Little Endian Order 的解釋, Little Endian Order 即是從最低的位元端開始儲存,以下圖舉例:
    value2 WORD 587 H ↓
   value2| 1 0 0 0 0 1  1  1  |(此欄位儲存 87 H)
      | 0 0 0 0 0 1 0 1  | (此欄位儲存 05 H)
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
      | 0 0 0 0 0 0 0 0 |
 及  value3 DWORD 9487 H ↓
   value3| 1 0 0 0 0 1  1  1  |(此欄位儲存 87 H)
      | 1 0 0 1 0 1  0 0  | (此欄位儲存 94 H)
      | 0 0 0 0 0 0 0 0 | (此欄位儲存 00 H)
      | 0 0 0 0 0 0 0 0 | (此欄位儲存 00 H)
      | 0 0 0 0 0 0 0 0 |
  由上兩張圖中,應該就可了解 Little Endian Order 的運作方式。而此規則為基本上 Intel 架構下所使用,而 Big Endian Order 則是為已不流行的 IBM 架構所用(QQ),所以以上為小弟的上課心得啦,也主要是替自己複習,這麼有趣的事不想忘~

留言

這個網誌中的熱門文章

4/9(一)Visual Studio Code - 偵錯配接器處理序已意外終止問題(Debug adapter process has terminated unexpectedly solution on Windows 10)

2019/09/24(二)【ITSA】[C_AR04-易] 邊緣偵測