天天看點

深入了解計算機系統cp1:存儲機關與編碼

摘要: 了解計算機是如何存儲資料的。

  • 原文:深入了解計算機系統cp1:存儲機關與編碼
  • 作者:Chor

Fundebug經授權轉載,版權歸原作者所有。

深入了解計算機系統cp1:存儲機關與編碼

1. 存儲機關

  • 位:即 bit,表示二進制位,要麼是 0 ,要麼是 1。它是計算機内部資料存儲的最小機關。比如 11010100 共有8個二進制位,是一個8位二進制數。
  • 位元組:即 byte,它由8個二進制位構成,即 1byte=8bit,是計算機内部計量的基本機關。一個英文字元占1個位元組(8位),一個漢字占2個位元組(16位)
  • 字:即word,它由若幹個位元組構成,是計算機内部進行資料處理和運算的基本機關。字的總的位數稱為字長,不同檔次的計算機字長是不一樣的,比如32位機,它的1個字由4個位元組構成,字長為32位,也就是說其CPU一次操作處理的實際位數是32位。同理,64位機可以處理64位。由此可見,計算機的字長越大,其性能越優越。
  • KB,MB:1024byte = 1KB,1024KB = 1MB。往上還有GB,TB。

PS:資料傳輸大多以 bit 為機關,比如我們常說的網速100M/s,M/s其實Mbit/s,也就是兆比特每秒,我們還可以寫成100Mbps。

2. 編碼

2.1 為什麼需要編碼?

  • 計算機隻能了解0和1,無法了解英文、字母、漢字和其他特殊字元,這些字元需要經過編碼才能成為計算機可以了解的二進制數。
  • 由字元到二進制數稱為編碼,反過來則是解碼。
  • 從字元到二進制數,需要有一個一一對應的映射,這個映射通過編碼規則來實作。
  • 通常所說的編碼其實包括編碼+字元集(即字元的集合體),比如 Unicode 字元集,就有 UTF-8,UTF-16 等多種編碼。

2.2 編碼規則的演變

  • ASCII:

    1)

    /ˈæski/

    ,即 American Standard Code for Information Interchange,美國資訊交換标準代碼。本來一個位元組有8位,每一位有0和1兩種狀态,則一個位元組共有2^8=256種狀态,可以表示256種字元。但是美國佬比較自私,覺得隻要可以表示自己的字母和一些特殊字元就足夠了,是以 ASCII 沒有占用最高位(而是固定為0),實際隻用到了後面7位,它可以表示 2^7=128 種狀态,也就是表示128個字元。

    2) 很顯然,這用來表示字母是足夠的,但要想表示其它語言的字元,128還是太少了。

    PS:附送 ASCII 對照表一張:

    深入了解計算機系統cp1:存儲機關與編碼
  • GB2312:

    1) 既然美國佬隻解決了字母和特殊符号的編碼問題,那麼我們中國人隻好實作自己的編碼,進而來表示漢字了。是以這時候出現了 GB2312 編碼(國标碼)。

    2) 問題:不幸的是,各個國家都是這麼想的,是以小日本有了 Shift_JIS 編碼,棒子有了 Euc-kr 編碼…..一時之間各國都有了自己的标準,那麼對于一個多語言混合的文本來說,存在着不同的編碼規則,最終必然導緻亂碼。

  • Unicode:

    1) Unicode 解決了編碼統一的問題。每種語言的每個字元在 Unicode 的規則下,都隻有統一且唯一的對應二進制編碼。它的表示方法是

    U+[16進制數]

    。例如,大寫字母 A 編碼為

    U+0041

    ,漢字“嚴”編碼為

    U+4E25

    2) 問題:Unicode 一般用2個位元組(也就是16位)表示一個字元,這在表示 ASCII 字元的時候會出現問題。我們知道,ASCII 字元實際隻需要一個位元組就夠了,并且最高位甚至都還不需要用到,但是 Unicode 又規定表示一個字元至少需要2個位元組,那麼一個 ASCII 字元前面就必須要補0以滿足這個規則,例如字母 A 就需要用

    00000000 01000001

    表示,這些多餘的0是一個極大的資源浪費。
  • UTF-8:

    1) UTF:實際傳輸過程中,基于不同的系統平台,對 Unicode 會有不不同的實作方式,其實作方式稱為 Unicode Transformation Format,即 UTF。

    2) 作為 Unicode 的一種實作方式,UTF-8 展現了一定的靈活性——它是一種變長編碼,會根據具體字元來改變所需要的表示位元組。其編碼規則隻有兩條:

    i>. 對于 128 個 ASCII 字元隻需一個位元組表示,位元組的第一位補 0,後面 7 位為這個字元的 ASCII 二進制數。Unicode 範圍為 U+0000 至U+007F。

    ii>. 對于 n 位元組的符号(n>1),第一個位元組的前 n 位都設為 1,第 n+1 位設為 0,後面位元組的前兩位一律設為 10。剩下的沒有提及的二進制位,全部為這個符号的 Unicode 碼二進制數。Unicode 範圍由 U+0080 起。

也可以看下面這張圖:

深入了解計算機系統cp1:存儲機關與編碼

參考:

  • 基礎:ASCII,Unicode 和 UTF-8
  • 字元串和編碼

關于Fundebug

繼續閱讀