大神之路-起始篇 | 第3章.電腦科學導論之【資料儲存】學習筆記

全棧工程師修煉指南發表於2023-04-06
[ 點選 ? 關注「 全棧工程師修煉指南」公眾號 ]

設為「⭐️ 星標」帶你從基礎入門全棧實踐 再到 放棄學習
涉及 網路安全運維、應用開發、物聯網IOT、學習路徑 、個人感悟 等知識分享。

希望各位看友多多支援【關注、點贊、評論、收藏、投幣】,助力每一個夢想。

WeiyiGeek Blog's - 花開堪折直須折,莫待無花空折枝 】
作者主頁: 【 https://weiyigeek.top
部落格地址: 【 https://blog.weiyigeek.top 】
作者答疑學習交流群:歡迎各位志同道合的朋友一起學習交流【點選 ? 加入交流群】, 或者關注公眾號回覆【學習交流群】。



第 2 部分 資料的表示和運算

描述:該部分包括第234章,我們分別進行如下學習。

  • 2章討論了數字系統,數量如何能使用符號來表示。

  • 3章討論了不同的資料如何儲存在計算機中。

  • 4章討論了一些基本的算術運算與位(邏輯)運算。

原文地址: https://mp.weixin.qq.com/s/XmsELA7atGCwDnfIP5yMtw

3.資料儲存

描述:計算機是一個可程式設計的資料處理機器,在進行資料的儲存學習前需要理解資料的特性。

3.1 資料型別

如今,資料以不同形式出現,如數字、文字、音訊、影像和影片,而在計算機中常常使用多媒體來定義包含它們。

在其計算機內部資料都是採用統一的資料表示法轉換後存入計算機中(無需辨別它們表示的是何種資料型別),當資料需要從計算機輸出時在還原回來,此種通用格式稱為位模式

  • 位(bit, binary digit 縮寫) : 儲存在計算機中的最小單元,只有 0 或 1(電子開關),其代表裝置的某一狀態。
  • 位模式: 使用其表示資料的不同型別,它是一個序列,有時被稱為位流,通常長度為8的位模式被稱為1位元組,例如 16個位組成的位模式 1000 1010 1111 1111(需要16個電子開關)。
  • 資料壓縮:為了佔用較少的(節約)記憶體空間,資料在儲存到計算機之前通常需要被壓縮。
  • 錯誤檢測和糾正:在傳輸和儲存資料時,需要針對其資料進行錯誤檢測和糾正。

WeiyiGeek.不同資料型別的儲存


3.2 數字儲存

描述: 在儲存到計算機記憶體中之前,數字被轉換到二進位制系統,對於整數的轉換還是非常簡單,而對於小數點,計算機使用兩種不同的表示方法即定點 (把數字作為整數儲存——沒有小數部分)浮點 (把數字作為實數儲存——帶有小數部分)

本節講解的重點,從計算機中有無符號位數的表示和儲存、整數以及實數的表示和儲存、到原碼、反碼、補碼的介紹計算。

(1) 無/有符號數
  • 無符號數:即正整數與正實數。

暫存器的位數反映無符號數的表示範圍

8 位 = 2^8 = 1111 1111 (二進位制) = 0 ~ 255

16 位 = 2^16 = 1111 1111 1111 1111 (二進位制) = 0 ~ 65535

  • 有符號數:即負整數與負實數。

符號表示格式:

真值數:帶符號的數,即帶“+”或“-”符號的數為真值。

機器數:符號數字化的數, 即用0,1這種表示正負的數稱為機器數。

例如:下表中帶符號的數與符號數字化的數分別對應,利用符號加絕對值表示法.

帶符號的數 符號數字化的數
+ 0.1011 0(.)1011
- 0.1011 1(.)1011
+ 1100 0 1100(.)
- 1100 1 1100(.)

溫馨提示:從上之中我們可以看到計算機中是如何儲存負數的,在其值的最高位為符號標誌位,其餘的為數值位。


(2) 整數的儲存

整數是完整的數字(即沒有小數部分),通常使用定點表示法(此種表示法中,小數點是假定的,但並不儲存)儲存在記憶體中,整數可以被當作小數點位置固定的數字,小數點固定在最右邊。

為了更有效地利用計算機記憶體,無符號和有符號的整數在計算機中儲存方式是不同的,即分為下面三種方法

無符號表示法:其只包括零和正數的非負整數,它的範圍介於0到無窮大之間,該方法可以提高儲存的效率。

  • 1.儲存無符號整數:首先將整數變成二進位制數,如果二進位制位數不足n位,則在二進位制數的左邊補0,使它的總位數為n位,如果位數大於n,該整數無法儲存,導致溢位的情況發生,我們後面要討論。

例如,將 7 儲存在 8 位儲存單元中,使用符號表示法
(7)10 = (111)2 = 0000 1111 (左邊加5位0)

  • 2.譯解無符號整數: 即輸出裝置譯解記憶體中位模式的位串並轉換為一個十進位制的無符號整數,可安裝二進位制轉換為十進位制步驟進行即可。

  • 3.溢位問題:儲存單元的位的數量有限制,可以表達整數範圍是有限的,例如,在n位儲存單元中可以儲存的無符號整數僅為0到2^n-1,如果 20 = (10100)2 只保留4位儲存單元的情況下,其結果為 0100 ,因為丟掉了左邊的位,整數顯示為 4 而不是20。

  • 4.無符號整數的應用:

  • 計數:當我們計數時,不需要負數。可以從1 (有時0)開始增長。

  • 定址:有些計算機語言,在一個儲存單元中儲存了另一個儲存單元的地址。地址都是從0 (儲存器的第一個位元組)開始到整個儲存器的總位元組數的正數,在這裡同樣也不需要用到負數。因此無符號整數可以輕鬆地完成這個工作。

  • 儲存其他資料型別:我們後面將談到的其他資料型別(文字、影像、音訊和影片)是以位模式儲存的,可以翻譯為無符號整數。

WeiyiGeek.無符號表示法

符號加絕對值表示法: 在儲存整數中該方法並不常用,但該格式用於在計算機中儲存部分實數,用符號加絕對值格式儲存一個整數,需要用1個二進位制位表示符號(0表示正,1表示負), 意味著在一個8位儲存單元中,可以僅用7位表示數字的絕對值(不帶符號)。因此,最大的正數值僅是無符號最大數的一半。在n位單元可儲存的數字範圍是 -(2^(n-1)-1)+(2^(n-1)-1).

  • 1.儲存有符號整數: 最左位用於定義整數的符號(0表示正整數,1表示負整數)

    例如,使用符號加絕對值表示法將+28與-28分別儲存在8位儲存單元中。

    +28 = + (11100)2 = 0001 1100

    -28 = - (11100)2 = 1000 1100

  • 2.符號加絕對值表示法的溢位:同無符號整數一樣,有符號的整數也會溢位,並且可能有正負兩種溢位情況。

    例如,當使用4位記憶體單元儲存一個用符號加絕對值表示法的整數時出現的正負兩種溢位,當我們試圖儲存一個比7大的正整數時,出現正溢位。

  • 3.符號加絕對值表示法的應用:符號加絕對值表示法不用於儲存整數,而用於儲存部分實數,我們後面會看到,此表示法通常用於釆樣模擬訊號,例如,音訊

WeiyiGeek.符號加絕對值表示法

  • 二進位制補碼錶示法: 幾乎所有的計算機都使用二進位制補碼錶示法來儲存位於n位儲存單元中的有符號整數,例如,如果n4,該範圍是00001111,這個範圍分為兩半:00000110以及10001111.這兩半按照左負右正的常規互相交換。賦值給負和非負(零和正)整數的位模式,即我們後續需要學習計算機基礎的原碼、反碼、補碼的相關知識(此處先不展開講解)。

(3) 實數的儲存

實數是帶有整數部分和小數部分的數字,對於小數點的處理計算機適用定點和浮點 兩種不同的表示方法。

定點表示法: 小數點按約定方式標出,但是儘管固定小數點的表示法(定點)可用於表示實數,但結果不一定精確或達不到需要的精度,所以帶有很大的整數部分或很小的小數部分的實數不應該用定點表示法儲存

例如,在十進位制系統中,假定我們用一種小數點右邊2個數碼,左邊14個數碼,總共16個數碼的定點表示法。那麼如果試圖表示十進位制數1.002 34,該系統的實數精度就會受損,該系統會把這個數字儲存為1.00.


浮點表示法: 用於維持正確度或精度的解決方法,其允許小數點浮動,即可以在小數點的左右有不同數量的數碼,此種方法極大地增加了可儲存的實數範圍,所以該方法適用於表示帶有很大的整數部分或很小的小數部分的實數。

在浮點表示法中,無論十進位制還是二進位制,一個數字都由3部分組成,即 符號、位移量、定點數三部分。

  • 第一部分是符號,可正可負。
  • 第二部分是位移量,顯示小數點應該左右移動構成實際數字的位移量。
  • 第三部分是定點數,小數點位置固定的定點表示法。

在稱作科學計數法(浮點表示法)的表示法中, 定點部分在小數點左邊只有1個數碼而且位移量是10的冪次。

例如,使用科學計數法表示十進位制數 7 425 000 000 000 000 000 000

# 左邊保留一位整數,將小數點移動到7後。
十進位制數:+ 7 425 000 000 000 000 000 000
科學計數法:7.425 x 10^21   (或者 +4.425E21)

例如,使用科學計數法表示數字 -0.000 000 000 000 023 2

# 同樣,此處將小數點移動到首個數碼2後。
十進位制數: - 0.000 000 000 000 023 2
科學計數法: - 2.32 x 10^-14  (或者 - 2.32E-14)

例如,使用浮點格式(浮點表示法)表示數字-(0.00000000000000101)2

# 同樣,小數左邊只留一個非零數碼,注意指數作為負的二進位制數儲存在計算機中。
二進位制數:-(0.0 0000 0000 0000 0101)2
科學計數法: - 1.01 x 2^-14 

規範化:為了統一表示法固定部分,科學計數法(用於十進位制)和浮點表示法(用於二進位制)都在小數點左邊適用唯一非零(0)數碼。

例如,十進位制系統中的數碼可能是1~9,而二進位制系統中該數碼是1。即

十進位制: ± d.xxxxxxxxxxx  其中, d 取值範圍 1-9,x 取值範圍 0-9
二進位制: ± 1.yyyyyyyyyyy  其中, y 取值範圍是 0 或 1 。

符號、指數和尾數: 在一個二進位制數規範化之後,只儲存了一個數的三部分資訊:符號、指數和尾數(小數點右邊的位)

  • 符號: 一個數的符號可以用一個二進位制位來儲存(01 )。
  • 指數(2的冪): 定義為小數點移動的位數,注意冪可以為正也可以為負。餘碼表示法(後面討論)是用來儲存指數位的方法。
  • 尾數:是指小數點右邊的二進位制數,它定義了該數的精度,尾數是作為無符號整數儲存的。
# 例如,+(1000111.0101)2規範化後變成為:
符號 指數  尾數
+   2^6  1.0001110101
+   6      0001110101

溫馨提示: 小數點和定點部分左邊的位1並沒有儲存(即1.),它們是隱含的

溫馨提示:尾數是帶符號的小數部分,像以符號加絕對值表示法儲存的整數那樣對待。


餘碼系統: 正的和負的整數都可以作為無符號數儲存,則在餘碼系統中的所有整數都是正數。而為了表示正的或負的整數,一個正整數(稱為一個偏移量)加到每個數字中,將它們統一移到非負的一邊,其中偏移量的值計算表示式 2^(m-1)-1, m是記憶體單元儲存指數的大小。

例如,對於4位儲存單元,則其偏移量是 2^(4-1)-1=7

例如,我們可以用4位儲存單元在數字系統中表示16個整數。使用一個單元作為0,分開其他15個(不等地)我們可以在-7〜8的範圍中表示整數,如圖下圖所示。在該範圍中增加7個單位到每個整數中,可以統一把所有整數向右移,使其均為整數而無需改變這些整數的相對位置,避免了相互調整,如圖下圖所示,新系統稱為餘7,或者偏移量為7的偏移表示法

WeiyiGeek.餘碼系統


IEEE 儲存浮點數的標準

IEEE 是電氣和電子工程師協會,定義了幾種儲存浮點數的標準,其中耳熟能詳的有單精度雙精度

  • 單精度數格式: 採用總共32位來儲存一個浮點表示法的實數。符號佔用1位(0為正,1 為負),指數佔用8位(使用偏移量127),尾數使用23位(無符號數)。該標準有時稱為餘127碼(Excess_127 ),因為偏移量是127

  • 雙精度數格式: 釆用總共64位來儲存一個浮點表示法的實數。符號佔用1(0為正,1 為負),指數佔用11位(使用偏移量1023 ),尾數使用52位。該標準有時稱為餘1023(Excess_1023 ),因為偏移量是1023

WeiyIGeek.IEEE儲存浮點數的標準規格

IEEE 標準浮點數的儲存

將一個實數可以儲存為IEEE標準浮點數格式的步驟如下:

  • 步驟 1.在S中儲存符號(0或1 )。
    步驟 2.將數字轉換為二進位制。
    步驟 3.規範化。
    步驟 4.找到E和 M的值。
    步驟 5.連線S(1位)、E(8位)和M(23位)。

例如,十進位制5.75餘127碼(單精度)表示法。

符號 +  S=0
二進位制: 101.11 (小數點後連乘法)
規範化: + (1.0111)2 x 2^2
E和M值: E = 指數 + 餘碼 = 2 + 127 = 129 = (10000001)2, M = 尾數 = (0111)2 = 0111 000 ... 000 (在M右側增加19個0使之成為23位)
表示法:   S  E        M
儲存資料: 0  10000001 0111 0000 0000 0000 0000 000

例如,十進位制-0.0234375餘127碼(單精度)表示法。

符號: - S=1
二進位制: 0.0234375 = 0.0000011
規範化: - (1.1)*10^-6
E和M值: E = 指數 + 餘碼 = -6 + 127 = 121 = (01111001)2,  M = 尾數 = (1)2 = 1000 .... 0000 (在M右側增加22個0使之成為23位)
表示法:   S  E        M
儲存資料: 1  01111001 1000 0000 0000 0000 0000 000

IEEE 標準儲存的浮點數還原

將一個被IEEE標準儲存的浮點數還原為原數字的流程如下:

  • 步驟 1)找到S、E和M的值。
    步驟 2)如果S=0,將符號設為正號,否則設為負號。
    步驟 3)找到位移量(E-127).
    步驟 4)對尾數去規範化。
    步驟 5)將去規範化的數字變為二進位制以求出絕對值。
    步驟 6)加上符號。

例如,將位模式(11001010000000000111000100001111)2以餘127碼的格式儲存與記憶體中,請求該數字原本的十進位制數。

# 1.由於是單精度,則首位S,後8位為E,剩下23是M
S   E         M
1   10010100  00000000111000100001111

# 2.原數字符號判斷
S = 1  , 則符號為負號(-)

# 3.求得位移量
E = (10010100)2 - 127 = 148 - 127 = 21

# 4.將二進位制小數點前只能為1與尾陣列合拼接獲得規範化
(1.00000000111000100001111)2 x 2^21 

# 5.去規範化胡獲得二進位制數
(1000000001110001000011.11)2

# 6.原本的十進位制數並加上符號
-2 104 378.75

上溢和下溢

對於浮點數,有上溢和下溢兩種情況,例如使用32位記憶體單元(餘127碼)的浮點表示法,該表示法不能儲存很小或很大的絕對值。

  • 如果試圖儲存絕對值很小的數導致下溢的情況。
  • 如果試圖儲存絕對值很大的數導致上溢的情況。

WeiyiGeek.浮點數上溢和下溢


零值儲存: 當有整數部分和小數部分的實數設定為零的時候是0.0時,此時約定在這種情況下符號、指數和尾數都設為零。


截斷錯誤: 當使用浮點表示法儲存實數時儲存數字的值可能不是我們希望的。例如,假定我們需要在記憶體中用餘

127碼錶示法儲存這個數字:

WeiyiGeek.截斷錯誤

由上圖可知小數部分右邊的31被截掉了,這種原始數字與還原後數字的差異稱為截斷錯誤。在使用很小或很大數字的地方,如宇航業的計算中,這種型別的錯誤是很嚴重的。這種情況下, 我們需要更大的記憶體單元 (例如,64位,雙精度) 和 其他的表示法。為此IEEE定義了用於更大尾數的其他表示法。


(4) 原碼、反碼、補碼定義計算

描述:說到計算機資料的表示和儲存,不得不提到原碼、反碼、補碼。

  • 原碼:二進位制定點表示法, 即最高位為符號位 0 表示正, 1 表示負, 其餘位表示數值位大小,比如 (0 000 0111) B= 7 而 (1 000 0111) B = -7

  • 反碼:正數的反碼與其原碼相同, 負數的反碼時對其原碼逐位取反(符號位除外)

  • 補碼:正數的補碼與其原碼相同, 負數的補碼是在其反碼的末尾加1,或者在原碼減1在取反也是可以的(計算機中通常是使用補碼來存放負數的)。

計算機中的原碼、反碼和補碼快速計算瞭解(重點):

[八位暫存器] 數值 1 數值 -1 數值 1 +(-1)= 0
原碼 0 000 0001 1 000 0001 (符號位為 1) 1 000 0010 = (0 000 0001 + 1 000 0001) = -2
反碼 0 000 0001 1 111 1110 (符號位不變,按位取反) 1 111 1111 = (0 000 0001 + 1 111 1110) = - 0
補碼 0 000 0001 1 111 1111 (反碼+1) 0 000 0000 = (1111 1111 + 0000 0001) = 1 0000 0000 (八位暫存器取只取後八位)

溫馨提示:

原碼在表示數字0時,有兩種方式表達 (0000 0000)B = 0 (1000 0000)B = -0,所以顯然使用原碼來表示數值正負不合適。

反碼在表示數字0時,也有兩種方式表達 (0000 0000)B = 0 (1111 1111)B = -0,所以顯然使用反碼來表示數值正負也是不合適。

補碼在進行計算0時,可以在數值位減1再取反或者在數值位取反後再加1也是可以的,其結果表示是精確的,所以顯然使用反碼來表示數值正負是非常合適的,並且計算機預設是使用補碼來表示數值的(重點)。

溫馨提示:如果將符號位 與 數值位 在執行時進行對其分離,但是這樣做會增加ACC累加器設計開銷過大。

舉例,求數值 7 與 - 7 的原碼、反碼、補碼的二進位制表示(八位暫存器)。

	 數值 7     |   數值 -7
原碼 0 000 0111  | 1 000 0111
反碼 0 000 0111  | 1 111 1000
補碼 0 000 0111  | 1 111 1001

計算機中的原碼、反碼和補碼取值範圍:

定點整數 定點小數
原碼 -(2^(n-1) - 1) ~ 2^(n-1) - 1 -1 < x < 1
反碼 -(2^(n-1) - 1) ~ 2^(n-1) - 1 -1 < x < 1
補碼 -2^(n-1) ~ 2^(n-1) - 1 -1 <= x < 1

溫馨提示:定點小數精確的表示範圍應該是,原碼為 -1 * (1 - 2^-(N-1)) ~ 1 - 2^-(N-1) ,其補碼為 -1 ~ 1 - 2^-(N-1).

原碼錶示法公式(原理)

  • 整數定義

\[[x]_原 = \left\{ \begin{array}{rcl} 0, x & { 2^n > x \geq 0} \\ 2^n-x & { 0\geq x > -2^n} \\ \end{array} \right.\\ 其中 x 為真值,n 為整數的位數. \]

  • 小數定義

\[[x]_原 = \left\{ \begin{array}{rcl} x & { 1 > x \geq 0} \\ 1-x & { 0 \geq x > -1} \\ \end{array} \right. \\ x 為真值 \]

整數原碼計算示例:如 15 與 - 15 數的表示流程。

數值 = 15 -> x = + 1111 -> [x]原 = 0,1111
數值 = - 15 -> x = - 1111 -> [x]原 = 2^4 - (- 1111) = 1 0000 + 1111 = 1,1111
如果是八位暫存器就為 1000 1111 。
Tips: 其中整數位數為4位,並且使用(逗號)將符號位與數值部分隔開。

小數原碼計算示例:例如 0.15 與 - 0.15 數的表示流程。

數值 = 0.15 -> x = + 0.1111 -> [x]原 = 0.1111
數值 = - 0.15 -> x = - 0.1111 -> [x]原 = 1 - (- 0.1111) = 1 + 0.1111 = 1.1111
Tips: 其中整數位數為4位.,並且使用(小數點)將符號位與數值部分隔開。

原碼特點: 表示簡單直觀但是在使用原碼做加法時,會出現結果符號可正可負的問題。

正數的原碼符號位為0;數值位為其真值
負數的原碼符號位為1;數值位為其真值


補碼錶示法公式(原理)

  • 整數定義

\[[x]_補 = \left\{ \begin{array}{rcl} 0,x & { 2^n > x \geq 0} \\ 2^{n+1}+x & { 0 > x \geq -2^n } & (mod 2^{n+1})\\ \end{array} \right.\\ 其中 x 為真值,n 為整數的位數. \]

  • 小數定義

\[[x]_補 = \left\{ \begin{array}{rcl} x & { 1 > x \geq 0} \\ 2+x & { 0 \geq x > -1} & (mod 2) \end{array} \right. \\ 其中 x 為真值 \]

整數補碼計算示例:如 15 與 - 15 數的表示流程。

數值 = 15 -> x =1111 -> [x]補 = 0,1111
數值 = -15 -> x = - 1111 -> [x]補 = 2^(4+1) + (- 1111) = 10 0000 - 1111 = 1 0001
八位補碼形式:1111 0001
64位補碼形式:1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001

正數的補碼符號位為0;數值位為其真值
負數的補碼符號位為1;數值位為其真值對應位求反後末位加1


反碼錶示法公式(原理)

  • 整數定義

\[[x]_反 = \left\{ \begin{array}{rcl} 0,x & { 2^n > x \geq 0} \\ (2^{n+1} - 1) +x & { 0 > x \geq -2^n } & (mod 2^{n+1} - 1)\\ \end{array} \right. \\ 其中x為真值,n為整數的位數 \]

  • 小數定義

\[[x]_反 = \left\{ \begin{array}{rcl} x & { 1 > x \geq 0} \\ (2 - 2^{-n}) +x & { 0 \geq x > -1 } & (mod 2 - 2^{-n})\\ \end{array} \right. \\ 其中x為真值,n為小數的位數 \]

整數反碼計算示例:如 15 與 - 15 數的表示流程。

數值 = 15 -> x = + 1111 -> [x]反 = 0,1111
數值 = -15 -> x = - 1111 -> [x]反 = ( 2^(4+1) - 1 ) + (- 1111) = 1 1111 - 1111 = 1 0000
八位反碼形式:1111 0000
64位補碼形式:1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000

小數反碼計算示例:求 - 13 / 64 的反碼

-(8 + 4 + 1) / 64 = - ( 1/8 + 1/16 + 1/64) = -(2^3 + 2^4 + 2^6) = - (0.001101)2 = 1.110010 (反碼)

解釋:1/8 = 2^-3 化為2進製為 (0.001)2 ,1/16 = 2^-4 化為2進製為(0.0001)2 ,1/64= 2^-6 化為2進製為 (0.000001)2

正數的補碼符號位為0;數值位為其真值
負數的補碼符號位為1;數值位為其真值對應位求反


移碼錶示法公式(原理)

計算步驟:

  • 方法一(簡單):在補碼的基礎上,符號位取反
  • 方法二:[e]移 = 2^k + e , -2^k <= e <= 2^k

整數移碼計算示例:如 9 與 - 9 數的表示流程。

  • x = + ( 1001 )2 , [x]補 = ( 01001 )2,[x]移 = ( 11001 )2
  • x = - ( 1001 )2 , [x]反 = ( 10110 )2,[x]補 = ( 10111 )2,[x]移 = ( 00111 )2

舉例,求 - 13 / 64 的補碼

-13/64=(-0.001101)2,[x]反=1.110010 ,[x]補=1.110011 ,[x]移=0.110011

有整數和小數部分組合形成的數值

描述:十進位制數轉換為任意進位制數 , 通常採用基數相乘法,對整數部分用除基取餘法,對小數部分用乘基取整法,最後將整數和小數拼接在一起。

例如,將十進位制數123.6875轉換成二進位制數,最終結果為 (1111011.1011)2

# 整數部分 -> 除基取餘法
123 % 2 = 1   # 最低位
61 % 2  = 1
30 % 2  = 0
15 % 2  = 1
7 % 2   = 1
3 % 2   = 1
1 % 2   = 1   # 最高位
# 結果 : 0111 1011  (八位暫存器,左邊補0)

# 小數部分 -> 乘基取整法
0.6875 * 2 = 1 # 最高位
= 1.3750
0.3750 * 2 = 0
= 0.7500 
0.7500 * 2 = 1
= 1.5000
0.5000 * 2 = 1 # 最低值
= 1.0000
# 結果 : 1011 

溫馨提示:小數和整數不一樣,整數可以連續表示,但小數是離散的。二進位制的小數只能表示 1/2, 1/4, ……, 1/2n, 因此無法表示所有的十進位制小數。
溫馨提示:整數與小數的二進位制最高位都在最左邊。


而在將整數和小數轉換成為八進位制或者十二進位制時,在轉換時應以小數點為界。

整數部分:在從小數點開始往左數,將一串二進位制數分為3位(八進位制)一組或4位(十六進位制)一組,在數的最左邊可根據需要加“0”補齊;(左補齊)

小數部分,從小數點開始往右數,也將一串二進位制分為3位一組或4位一組,在數的最右邊也可以根據需要加“0”補齊。(右補齊)

最終使總的位數為3或4的整數倍,然後分別用對應的八進位制數或十六進位制數取代;

例: 將二進位制數 1111000010.01101 分別轉換為八進位制數和十六進位制數。

# 1111000010.01101 => 八進位制
[00]1 111 000 010.011 01[0]      # 左補齊兩個00,右補齊一個0
1     7   0   2   3    2   =>  (1702.32)O
# 1111000010.01101 => 十六進位制
[00]11 1100 0010.0110 1[000]     # 左補齊兩個00,右補齊三個000
3      C    2    6    8   =>   (3C2.68)H

三種機器數小結

  • 最高位為符號位,書寫上用,(整數)或.(小數)將數值部分和符號位隔開。
  • 對於正數,原碼=補碼=反碼。
  • 對於負數,符號位為1,其數值部分原碼除符號位外每位按位取反末尾加1就為補碼,如果不加一就為反碼。
  • 計算機裡一般使用補碼錶示負數,例如,數值-15的二進位制數為 1111 0001(8位暫存器)。
  • [y]補 連同符號在內,每位取反,末位加1,即得 [-y] 補,例如 -5 的補碼為 1111 1011 (8位暫存器)。
  • 如下圖所顯示無符號、符號絕對值、二進位制補碼等表示法的對比,例如,使用4位儲存單元以儲存0〜15之間的無符號整數, 儲存單元可以儲存-8〜+7之間的二進位制補碼整數。

WeiyiGeek.無符號、符號絕對值、二進位制補碼等表示法


3.3 文字儲存

在任何語言中,文字的片斷是用來表示該語言中某個意思的一系列的符號,而在計算機中可以用位模式來表示任何一個符號,例如

  • 使用26個符號(A, B, C,…,Z)來表示大寫字母
  • 使用26個符號(a, b, c, •••, z)表示小寫字母,
  • 使用10個符號(0, 1, 2,…,9)來表示數字字元(不是實際的數字,後面將看到它們的不同之處)
  • 使用單個符號(.,?,:,;,...,!)來表示標點。
  • 使用特殊符號(如空格、換行和製表符)被用於文字的對齊和可讀性。

在一種語言中,位模式到底需要多少位來表示一個符號?

答: 這主要取決於該語言集中到底有多少不同的符號,即在一種語言中,表示某一符號的位模式的長度取決於該語言中所使用的符號的數量。更多的符號意味著更長的位模式。

例如,如果要建立的某個虛構的語言僅僅使用大寫英文字母,則只需要26個符號,相應地這種語言的位模式至少需要表示26個符號,通常每個字母佔用1位元組。

例如,如果對於中文,可能需要更多的符號,通常每個文字佔有2~4位元組(與字元編碼有關)。

位模式的長度與符號的數量關係是呈對數的(其表示式為:位模式長度 = log2符號數量),如果需要2個符號,位模式長度將是1位(log22=1),如果需要4個符號,位模式長度將是2位(log24=2).

  • 1位的位模式能表示2種不同的形式:0,1
  • 2位的位模式能表示4種不同的形式:00, 01, 10和11

WeiyiGeek.符號數量與位模式長度的關係

程式碼與編碼區別

  • 程式碼:不同的位模式集合被設計用於表示文字符號,其中每一個集合我們稱之為程式碼。
  • 編碼:表示符號的轉換過程被稱為編碼。

現代計算機中常用的編碼如下所示:

  • ASCII : 美國資訊交換標準碼,由美國國家標準協會(ANSI)開發,程式碼使用7位表示每個符號,即該程式碼可以定義2^7=128種不同的符號.
  • Unicode:由硬體和軟體製造商聯合設計的編碼,設計程式碼使用32位並能表示最大達2^32=4 294 967 296個符號,該程式碼不同部分被分配用於表示來自世界上不同語言的符號,以及表示影像和特殊符號。(PS: 如今ASCII是Unicode的一部分)
  • 其他編碼: 鑑於Unicode的優勢,這些編碼變得不太流行,此處簡單瞭解即可。

位元組與字元的區別

  • 位元組(Byte):是計量單位,表示資料量多少,是計算機資訊科技用於計量儲存容量的一種計量單位
  • 字元(Character):計算機中使用的字母、數字、字和符號,比如'A'、'B'、'$'、'&'等字元。

現代計算機中不同編碼佔用的位元組情況(考試中以及在開發中處理中文字元時會涉及):

  • 符號:英文標點為一個位元組,中文標點為兩個位元組。例如:英文句號佔1個位元組的大小,中文句號佔2個位元組的大小。

  • ASCII 碼中,一個英文字母(不分大小寫)為一個位元組,一箇中文漢字為兩個位元組。

  • Unicode 編碼中,一個英文為一個位元組,一箇中文為兩個位元組。

  • UTF-8 編碼中,一個英文字為一個位元組,一箇中文為三個位元組。

  • UTF-16 編碼中,一個英文字母字元或一個漢字字元儲存都需要 2 個位元組(Unicode 擴充套件區的一些漢字儲存需要 4 個位元組)。

  • UTF-32 編碼中,世界上任何字元的儲存都需要 4 個位元組。


3.4 音訊儲存

音訊表示聲音或音樂,它是隨時間變化的實體,我們只能在每一時刻度量聲音的密度。

音訊本質上不同於數字與文字資料,音訊是模擬資料的例子,即使我們能夠在一段時間度量所有的值,也不能把它全部存在計算機記憶體中,因為可能需要無限數量的記憶體單元。

所以當我們討論用計算機記憶體儲存聲音時,我們的意思是儲存一個音訊訊號的密度,例如,每隔一段時間(一秒鐘,一小時)來自麥克風的訊號。

WeiyiGeek.音訊訊號採集

取樣、量化、編碼

計算機中要儲存音訊的需要進行取樣、量化、編碼等關鍵操作步驟:

取樣: 我們需要在模擬訊號上選擇數量有限的點來度量它們的值並記錄下來,例如上圖中音訊訊號我們選擇10個樣本,我們可以記錄這些值來表現模擬訊號。

Q: 下一個邏輯問題是我們每秒鐘需要多少樣本才能還原出原始訊號的副本?

如果訊號是平坦的,則需要很少的樣本;如果訊號變化劇烈,則需要更多的樣本,所以說樣本數量依賴於模擬訊號中變化的最大數量。

取樣率:通常每秒40 000個樣本的釆樣率對音訊訊號來說是足夠好的。

量化: 指的是將樣本的值擷取為最接近的整數值的一種過程(可以理解為四捨五入),從每個樣本測量來的值是真實的數字, 為每個樣本使用一個無符號的數(位模式)會更簡便,所以需要針對其進行量化。

例如,如果實際的值為17.2,就可擷取為17; 如果值為17.7,就可擷取為18。

編碼:量化的樣本值需要被編碼成位模式,某一些系統為樣本賦正值或負值,另一些僅僅移動曲線到正的區間從而只賦正值,換言之,一些系統使用無符號整數來表示樣本,而另一些使用有符號的整數來做。

  • 毎樣本位: 對於每個樣本系統需要決定分配多少位 ,每樣本位的數量有時稱為位深度,儘管在過去僅有8位分配給聲音樣本,現在每樣本16、24甚至32位都是正常的。

  • 位率:如果我們稱位深度或每樣本位的數量為B,每秒樣本數為S,我們需要為每秒的音訊儲存SxB位,該乘積有時稱為位率R。

    例如,如果我們使用每秒40 000個樣本以及每樣本16 位,位率是R=40 000 x 16=640 000 b/s=640 KB/s。


聲音編碼標準
當今音訊編碼的主流標準是MP3 (MPEG Layer3的簡寫,它是用於影片壓縮方法的MPEG (動態影像專家組)標準的一個修改版),除此之外還有AAC 、AC-3、AMR、WMA、ALAC、APE、FLAC、PCM、DSD、WAV、AIFF、MIDI等主流音訊編碼格式解析。

  • MP3 : 最通用最常見的格式, 它採用每秒44 100個樣本以及每樣本16 位, 結果訊號達到705 600 b/s的位率,再用去掉那些人耳無法識別的資訊的壓縮方法進行壓縮。 (有失真壓縮)
  • AAC : 高階音訊編碼(Advanced Audio Coding)的縮寫,是新一代的音訊有失真壓縮技術,在蘋果裝置上是最為常用的格式,其格式字尾名有aac,mp4,m4a三種。(有失真壓縮)
  • AC-3:數字音訊壓縮標準 (Digital Audio Compression Standard)音訊編碼格式,是傳說中的杜比實驗室的傑作,著名的有損資料壓縮的多媒體儲存格式, 可以包括多達6個獨立的聲道,其最知名的是5.1聲道技術。(有失真壓縮)
  • AMR:自適應多速率(Adaptive Multi-Rate)壓縮音訊編碼格式,是一個使語音編碼最最佳化的專利,專用於有效地壓縮語音訊率, 主要用於移動裝置的音訊壓縮,壓縮比非常高,但是音質比較差,主要用於語音類的音訊。(有失真壓縮)
  • WMA: (Windows Media Audio),它是微軟公司推出的與MP3格式齊名的一種新的音訊格式。由於WMA在壓縮比和音質方面都超過了MP3,在較低的取樣頻率下也能產生較好的音質,其字尾名為.wma, 但這種格式通常只能使用 Windows 自帶的 MediaPlayer 來播放,與純音訊的媒體串流格式.ASF 類似。(無失真壓縮)
  • ALAC: (Apple Lossless Audio Codec) 蘋果的無損音訊壓縮編碼格式,ALAC與MP3的主要分別在於編碼過程中,MP3會取消小部分高頻及低頻部分的音訊資料,而ALAC則會如實記錄,不會刪除音訊中任何細節資料。(無失真壓縮)
  • APE:它是Monkey’s Audio 公司提供的一種無失真壓縮音訊格式,它可以透過無失真壓縮技術使龐大的 WAV 檔案壓縮掉近一半而基本不怎麼損失音質。並且這個格式是完全的免費和開源。(無失真壓縮)
  • FLAC:損音訊壓縮編碼(Free Lossless Audio Codec。FLAC是一種著名的自由音訊壓縮編碼,其特點是無失真壓縮,不同於其他有失真壓縮編碼如MP3 及AAC,它不會破壞任何原有的音訊資訊,其字尾格式為.flac。(無失真壓縮)
  • PCM: 脈衝編碼調製(Pulse Code Modulated Audio),是目前計算機應用中最高保真水平的音訊編碼格式,PCM音訊資料是未經壓縮的音訊取樣資料裸流,它是由模擬訊號經過取樣、量化、編碼轉換成的標準的數字音訊資料,通常CD唱片都採用此格式。(無壓縮)
  • DSD:直接位元流數字(Direct Stream Digital)相對於PCM的最大優勢是,具有極小的量化噪聲, 超高的訊雜比,這是音樂發燒友才會玩的格式。(無壓縮)
  • WAV:是微軟公司(Microsoft)開發的一種聲音檔案格式,它是最接近無損的音樂格式,所以檔案大小相對也比較大,也是很多音訊處理軟體預設儲存的音訊格式。(無壓縮)
  • AIFF:音訊交換檔案格式(Audio Interchange File Format)的英文縮寫,是Apple公司開發的一種聲音檔案格式,是為了對抗微軟的WAV而開發。(無壓縮)
  • MIDI(Musical Instrument Digital Interface)格式被經常玩音樂的人使用,MIDI允許數字合成器和其他裝置交換資料。最大作用在於用電腦音樂作曲。所以它並不是錄製的聲音而是製作出的聲音,其字尾格式為 .mid。(無壓縮)

3.5 影像儲存

在計算機中儲存影像使用兩種不同的技術:光柵圖或向量圖。

(1) 光柵圖

當我們需要儲存模擬影像(如照片)時,就用到了光柵圖(或點陣圖),一張照片由模擬資料組成,不同的是資料密度(色彩)因空間變化,而不是因時間變化,同樣需要針對其樣本資料進行取樣(掃描)。

樣本稱為畫素(代表影像元素),換言之,整個影像被分成小的畫素,每個畫素假定有單獨的密度值。

1.解析度: 在影像處理中的掃描率稱為解析度,如果解析率足夠高,人眼不會看出在重現影像中的不連續。

2.色彩深度: 用於表現畫素的位的數量,即色彩深度,依賴於畫素的顏色是如何由不同的編碼技術來處理的,我們的眼睛有不同型別的感光細胞,一些響應紅、黃、藍三原色(也叫RGB), 而另一些僅僅響應光的密度。

  • 真彩色:用於畫素編碼的技術之一稱為真彩色,它使用24位來編碼一個畫素(可以表達 16777216 種顏色),在該技術中每個三原色(RGB)都表示為8位,所以每種色彩都由0〜255之間的三維數字表示。

  • 索引色:索引色(或調色盤色)模式僅使用真彩色裡其中的一部分,因為真彩色模式使用了超過1600萬種的顏色,許多應用程式不需要如此大的顏色範圍,在該模式中每個應用程式從大的色彩集中選擇一些顏色(通常是256種)並對其建立索引,對選中的顏色賦一個0〜255之間的值,對索引的使用減少了需要儲存一個畫素所需要的位的數量。(PS: 類似藝術家可能在他們的畫室用到很多種顏色,但一次僅用到他們調色盤中的一些。)

    例如,真彩模式需要24位來儲存一個畫素,索引色模式通常使用256個索引,這需要8位來儲存同樣的畫素。

    例如,一部高質量的數位相機要用幾乎3百萬畫素拍攝一張3X5英寸的相片。

    真彩色模式儲存所需要的位的數量:3 000 000 x 24 = 72 000 000

    索引色模式儲存所需要的位的數量:3 000 000 x 8 = 24 000 000

WeiyiGeek.索引色與真彩色的關係

3.影像編碼標準

在計算機中常用的影像編碼的標準是JPEG、PNG、GIF等

  • JPEG(Joint Photographic Experts Group):是JPEG標準的產物,該標準由國際標準化組織(ISO)制訂,是面向連續色調靜止影像的一種壓縮標準,使用真彩色模式,使用壓縮影像來減少位的數量,常用格式字尾名為.jpg或.jpeg

  • PNG(Portable Network Graphics):行動式網路圖形,是一種採用無失真壓縮演算法的點陣圖格式,支援索引、灰度、RGB三種顏色方案以及Alpha通道等特性.

  • GIF (Graphics Interchange Format):圖形交換格式,它是一種點陣圖,使用索引色模式。

溫馨提示:光柵圖有兩個缺點,即檔案體積太大和重新調整影像大小有麻煩,放大光柵影像意味著擴大畫素,所以放大後的影像看上去很粗糙。


擴充套件知識: 一個位元組8位元,畫素通常表示點陣圖(bitmap)中的一個點。

  • 對於 黑白影像(二值影像)一個詳畫素用一個bit表示,所以1位元組表示8畫素
  • 對於 灰度圖,一個畫素為 256 種狀態正好2的8次方,因此1位元組表示1畫素
  • 對於 RGB 圖,一個畫素為 256 x 256 x 256 種狀態正好2的24次方,因此3位元組表示1畫素

(2) 向量圖

向量圖影像編碼方法並不儲存每個畫素的位模式,一個影像被分解成幾何圖形的組合。

向量圖是由定義如何繪製這些形狀的一系列命令構成的,當要顯示或列印影像時,將影像的尺寸作為輸入傳給系統,於此同時系統會重新設計影像的大小並用相同的公式畫出影像,所以每次繪製影像時公式也將重新估算一次,因此向量圖也稱為幾何模型或物件導向圖形。

向量圖適合應用程式採用主要的幾何元素來建立影像。它用於諸如Flash這樣的應用程式,以及建立TrueType (微軟、蘋果公司)和PostScriptAdobe公司)字型,計算機輔助設計(CAD)也使用向量圖進行工程繪圖。

例如,線段、矩形或圓形,每個幾何形狀由數學公式表達。
例如,線段可以由它端點的座標描述,圓可以由它的圓心座標和半徑長度來描述。
例如,使用向量圖繪製出半徑為r的圓形,程式需要繪製該圓的主要資訊如下:

  • 一個圓的半徑r。
  • 圓心的位置。
  • 繪製的線型和顏色。
  • 填充的型別和顏色。

溫馨提示:當該圓的大小改變時,程式改變半徑的值並重新計算這些資訊以便再繪製一個圓,改變影像大小不會改變繪圖的質量。

溫馨提示:向量圖不適合儲存照片影像的細微精妙,推薦使用JPEGGIF光柵圖提供了更好和更生動的圖片。


3.6 影片儲存

影片是影像(稱為幀)在時間上的表示,一部電影就是一系列的幀一張接一張地播放而形成運動的影像。換言之,影片是隨空間(單個影像)和時間(一系列影像)變化的資訊表現。

所以在計算機中我們也就知道如何儲存影片,它將每一幅影像或幀轉化成一系列位模式並儲存,將這些影像組合起來就可表示影片。

溫馨提示:現在影片通常是被壓縮儲存的,常常使用的*MPEG*(Moving Picture Experts Group,動態影像專家組)技術針對常影片進行壓縮。


原文地址: https://blog.weiyigeek.top/2022/6-2-694.html

本文至此完畢,更多技術文章,盡情期待下一章節!


專欄書寫不易,如果您覺得這個專欄還不錯的,請給這篇專欄 【點個贊、投個幣、收個藏、關個注,轉個發,留個言】(人間六大情),這將對我的肯定,謝謝!。

點選 ? 關注「 全棧工程師修煉指南」公眾號
微信溝通交流: weiyigeeker (點選新增)
交流溝通群:629184198 或 關注公眾號回覆【學習交流群】

溫馨提示: 由於作者水平有限,本章錯漏缺點在所難免,希望讀者批評指正,並請在文章末尾留下您寶貴的經驗知識,聯絡郵箱地址 master@weiyigeek.top 或者關注公眾號 WeiyiGeek 聯絡我。

帥哥(靚仔)、美女,點個關注後續不迷路

相關文章