手摸手帶你理解 進制 字節 ASCII碼 Unicode 與 字節編碼(UTF-8 /16)等(上)

首先要講一個概念

計算機是使用 二進制 來存儲數據 的

爲什麼是二進制 不是 十進制 八進制 十六進制呢

原因有很多 粗略列舉幾點

1.技術上容易實現
- 這個很容易理解 計算機的最底層無非就是一堆集成電路按照,各種規則做着各種各樣的事情
- 對於 電路最簡單有效的傳達信息的方式自然是兩種 通電 放電
- 所以 用 0 代表低平電 1 代表高平電
2.可靠性高 不易出錯
-這個就更不用說了 就倆數字出錯的可能性也較低
3.運算規則相較其他進制較爲簡單

4.與邏輯相近 可以用 0 代表 false 1 代表true 等等

當我們知道了 計算機是使用二進制 來編碼的之後 需要明白一個概念

字節

我們規定一個二進制數佔一個字元 , 而八個二進制數就是一個字節(我查閱了半天資料確實沒找到 這是誰定的 但是有一點可以確定 那就是 這個概念出現的 ASCII 碼要早的 ,爲什麼強調這個,後文會講到,至少筆者認爲 不是因爲ASCII碼 才規定的 一個字節 等於 八個字元 )

Bit,乃BInary digit(二進制數)位的縮寫,
是數學家John Wilder Tukey提議的術語(可能是1946年提出,但有資料稱1943年就提出了)。
這個術語第一次被正式使用,是在香農著名的《信息論》,
即《通信的數學理論》(A Mathematical Theory of Communication)論文之第1頁中

ASCII

(American Standard Code for Information Interchange)即: 美國信息交換標準代碼

看起來很高大上的詞語,其實就是一種說話的方式.
可以想象的到計算機用 0 1 來表示信息,
那我們人又不知道 010101 是啥意思 機器自己也不知道這是啥意思,那我們想要真正利用起這個東西
就得給他定一個格式
比如說 :

			001 代表是 漢語中的 '我請', 
    		010 代表是 漢語中的 '你喫',
            100 代表是 漢語中的 '飯鴨'.
     		000 代表是一個字的結束

那 001000010000100 的意思就是 我請你喫飯鴨 機器碼也是這個原理

一開始的時候 計算機的 編碼十分混亂 世界存在不同地區的很多種字符集

(每一個符號字母都是字符 全都放一起就是字符集)

亂到什麼程度呢?

繼續拿上面舉例子 可能 A區的人 用的是我們上面定義 的規則 而B地區的人 可能

B規則		001 代表  漢語中的 '我們',
			010 代表  漢語中的 '去上',
			100 代表  漢語中的 '墳吧'
			000 代表一個字結束 

遵守的是這樣一套B規則 那麼 有一天 A區的人要 跟B區的人用計算機交流一下
發出了這樣一串碼 001000010000100000 意思是: 我請你喫飯鴨
可是B區的人看到這個意思就是 我們去上墳吧 ,
這個時候B區的人肯定就很奇怪 好端端的上什麼墳是吧 ,可是A區明明想表達的是 要請他喫飯啊
這可怎麼辦 白喫的飯不能不要啊

一直這樣錯下去也不行 那就商量商量我們都用一個編碼吧!

那就各自都拿方案來 這個國家提一個那個國家提一個 其中就包含 這個ASCII

美國標準信息交換代碼是由美國國家標準學會(American National Standard Institute , ANSI
)制定的,是一種標準的單字節字符編碼方案,用於基於文本的數據。它最初是美國國家標準,供不同計算機在相互通信時用作共同遵守的西文字符編碼標準,後來它被國際標準化組織(International
Organization for Standardization, ISO)定爲國際標準,稱爲ISO 10646標準

又是好大一串的術語 ,其實就是 ASCII碼是美國造的 後來被成了國際標準 讓大家都能夠好好講話!

我們來說說這個 ASCII 碼是咋定的 其實跟我們上面定 的A 規則 B規則 沒什麼不同就是比較正經一點.

首先:
它規定 一個 符號佔一個字節
我們上面已經講過了 一個字節
等於八個字元 也就是八個二進制數

進制

二進制數是啥 我們日常使用的其實是
十進制 逢十進一
其實在十進制裏是沒有十這個數字的
十進制中 一共有十個數(0,1,2,3,4,5,6,7,8,9)
9的後面其實是 1 0 來跟着我讀 一 零 它是進的一 只是我們方便讀成了十

其實我們日常生活中爲了方便 在說出某個數字的時候 就默認對方說的是十進制數字

而數字是數字 進制是進制

就比如 231(不要讀二百三十一 讀 二三一) 我們一般會認爲它是十進制數字 是231(二百三十一)
實際上它也可能是一個 16位進制的 231 那它轉化爲 十進制就會 變成 561

不懂沒關係 我們慢慢解釋

爲什麼 231 的十進制的數字是 231 呢
我們在計算的時候要從最後一位開始計算
計算規則就是 ( 數字*進制^位數 + 數字*進制^位數
^ 代表平方
那麼怎麼看這個計算規則呢
比如 說 231 是十進制的 二百三十一
從右往左看 1 是第0位 ,3是 第 1 位 ,2是 第 2

所以 231 在十進制中的數字應該這麼算 ( 數字*進制^位數 )

 (2*10^2)+ (3 * 10^1)+(1 * 10 ^ 0 )  = 231

所以 231(二三一) 在十進制 中是 231(二百三十一)

爲什麼 231(二三一) 作爲十六位進制轉化爲 十進制就變成了 561呢

(2*16^2)+ (3 * 16^1)+(1 * 16 ^ 0)  = 512 + 48 + 1 = 561 

上面這種 把其他數字轉換爲十進制的方法 叫做 按權相加

至於十進制轉換爲其他進制 作爲擴展就是 "除進製取餘,逆序排列" ,感興趣可以自己去了解

瞭解完進制 我們繼續看ASCII碼

它規定 一個 符號佔一個字節
我們上面已經講過了 一個字節
等於八個字元 也就是八個二進制數

一個字符有八個字元也就是 八個二進制數字
那我們來算一下 一個字符 最大能表示的十進制數字是多少
首先 2進制數字 是由 0 1 組成的 那麼 最大的肯定是 1對吧?
那 八個 1 應該就是 一個字符能表達的最大的數字了
也就是 11111111

按照上面說的按權相加法 把它轉換成 10進制數字試試

 (1*2^0)+(1*2^1)+(1*2^2)+(1*2^3)+(1*2^4)+(1*2^5)+(1*2^6)+(1*2^7)
=  1 + 2 + 4 + 8 + 16 + 32 + 64 + 128
=  255

也就是說 一個 字符最大表示的數字是 255
也就是能表示 0~255 ,一共 256個符號(0也是一個符號)

可是ASCII碼最後一次更新 是在 1986年 到目前爲止一共 收錄了128個字符 還有一半沒用呢

這是爲啥呢?

因爲實際上 雖然一個 ASCII 碼字符佔一字節 也就是 八位字元 但是實際上只用了7位 ,空出了最高位 用做奇偶校驗 ,也不用管他幹嘛的就是一種規則 來判斷你這個數字對不對 畢竟後邊 那麼多的0 1呢,你說是吧?

要說這事兒吧, 也是 老美沒有考慮周到 ,因爲ASCII碼一開始沒定義多少個 ,他就覺得夠用了,到後來發展越來越快 ,計算機的字符越來越多 ,各種語言啊,表情啊之類的字符 ,可是ASCII碼只有 128位啊 , 那怎麼辦? 然後各國國家又開始研發自己的標準 來存自己的字符了,這可不行啊,於是下一個主角應運而生.

Unicode

下一章再講

附下章鏈接 手摸手帶你理解 進制 字節 ASCII碼 Unicode 與 字節編碼(UTF-8 /16)等(下)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章