👋 歡迎來到二進制數系!
歡迎來到計算機科學所有基礎知識的基石!這一章「二進制數系」是你探索數據表示(Representing Data)旅程的一部分。電腦所做的一切——從顯示一張相片到執行複雜的運算——歸根究底都是由「1」和「0」組成的。
如果數字不是你最喜歡的科目,也不用擔心。我們將拆解這些概念,比較不同的數系(二進制、十進制、十六進制),並學習電腦處理負數和分數等棘手問題的巧妙技巧。讓我們開始吧!
1. 基礎:數基與單位 (3.5.1 & 3.5.2)
1.1 理解不同的數基(10、2、16 進制)
我們習慣使用十進制(Decimal),即基數 10 來計數。然而,電腦是以電力(開或關)運作的,因此它們使用二進制(Binary),即基數 2。
- 十進制(基數 10): 使用 10 個數字(0–9)。每一位代表 10 的冪(個位、十位、百位、千位……)。
- 二進制(基數 2): 只使用 2 個數字(0 和 1)。每一位代表 2 的冪(1, 2, 4, 8, 16……)。這些單個數字被稱為位元(Bits)。
- 十六進制(基數 16): 使用 16 個符號(0–9 以及 A–F)。這個系統是二進制的縮寫,讓程式設計師更容易閱讀冗長的二進制字串。
你知道嗎?「十六進制」使用 A=10, B=11, C=12, D=13, E=14, F=15。
1.2 資訊單位
資訊的最小單位是位元(Bit)(單個 0 或 1)。不過,數據通常會分組處理:
- 位元組(Byte)是一組 8 個位元。
-
使用 \(n\) 個位元可以表示的唯一數值數量為 \(2^n\)。
例子:使用 3 個位元,你可以表示 \(2^3 = 8\) 個不同的數值(從 000 到 111)。
1.3 二進制與十進制前綴(Kilo 的爭議)
談到電腦記憶體大小時,我們會使用前綴,但主要有兩種類型:
二進制前綴(2 的冪) - 用於儲存空間/記憶體:
這些基於 \(2^{10}\) (1024) 的冪,通常用於精確定義記憶體大小。
- Kibi (Ki): \(2^{10}\) (1,024)
(例如:1 KiB = 1024 Bytes) - Mebi (Mi): \(2^{20}\) (1,048,576)
- Gibi (Gi): \(2^{30}\)
- Tebi (Ti): \(2^{40}\)
十進制前綴(10 的冪) - 用於通訊速度:
這是我們在數學和科學中使用的標準前綴,基於 \(10^3\) (1000) 的冪。
- kilo (k): \(10^3\) (1,000)
(例如:1 kB = 1000 Bytes) - mega (M): \(10^6\) (1,000,000)
- giga (G): \(10^9\)
- tera (T): \(10^{12}\)
重點: 電腦以二進制(基數 2)溝通。十六進制(基數 16)是人類友好的速記法。討論數據容量時,請務必記住 Kibi (\(2^{10}\)) 與 kilo (\(10^3\)) 之間的區別。
1.4 數基轉換
雖然轉換不會單獨作為考題,但你需要能夠在處理其他主題(如浮點數或組合語言)時進行轉換。
十進制轉二進制(例子:將 42 (基數 10) 轉換為二進制)
- 找出能放入 42 的最大 2 的冪(即 32)。在該位置放 1。
- 用 42 減去 32,餘數為 10。
- 檢查下一個 2 的冪(16)。16 能放入 10 嗎?不能。放 0。
- 檢查 8。8 能放入 10 嗎?可以。放 1,餘數為 2。
- 檢查 4。4 能放入 2 嗎?不能。放 0。
- 檢查 2。可以。放 1,餘數為 0。
- 檢查 1。不能。放 0。
4210 = 001010102 (以 8 位元表示)
二進制轉十六進制(快捷方法)
- 從右往左,將二進制數字每 4 個分為一組。(每組 4 個位元稱為半位元(nibble),精確對應一個十六進制數字)。
- 將每個半位元轉換為對應的十六進制數。
例子:10110011
第 1 組:1011 (8 + 2 + 1) = 11。在十六進制中為 B。
第 2 組:0011 (2 + 1) = 3。在十六進制中為 3。
結果:101100112 = B316
2. 表示正整數:無符號二進制(Unsigned Binary, 3.5.3.1)
2.1 無符號二進制 vs. 有符號二進制
無符號二進制是最簡單的形式,其中所有位元都用於表示正數的大小。它沒有表示負數的機制。
有符號二進制(接下來會介紹)保留一個位元(通常是最高有效位,即 MSB)來表示數字是正數還是負數。
2.2 無符號整數的範圍
如果你有 \(n\) 個位元,無符號二進制能表示的數值範圍是:
最小值:0
最大值:\(2^n - 1\)
例子:使用 8 個位元 (\(n=8\))
最大值:\(2^8 - 1 = 256 - 1 = 255\)。
範圍:0 到 255。
2.3 無符號二進制運算(3.5.3.2)
二進制的加法和乘法規則與十進制算術類似,但只有當總和為 2 或以上時,才需要進位 1。
二進制加法規則:
- 0 + 0 = 0
- 0 + 1 = 1
- 1 + 1 = 0(進位 1)
- 1 + 1 + 1(進位輸入)= 1(進位 1)
加法例子 (12 + 5 = 17):
1 1 0 0 (12)
+ 0 1 0 1 (5)
-----
1 0 0 0 1 (17)
常見錯誤: 進行算術運算時,如果結果所需的位元數超過了分配的空間,就會出現溢位錯誤(overflow error)(將在第 5 節介紹)。
重點: 無符號二進制簡單易用,只能表示正數,且最大值永遠是 \(2^n - 1\)。
3. 表示負整數:二補數(Two's Complement, 3.5.3.3)
二補數是考試中唯一需要掌握的有符號二進制表示法。它允許電腦使用標準的加法電路來進行減法運算,從而簡化了硬體設計。
3.1 識別符號
在二補數中:
- 最高有效位(MSB)(最左邊的位元)用於表示符號。
- 如果 MSB 是 0,該數為正數。
- 如果 MSB 是 1,該數為負數。
3.2 二補數整數的範圍
由於一個位元被保留用於表示符號,因此在相同位元數下,其最大範圍比無符號二進制小。
對於 \(n\) 個位元,範圍是:
最大正值:\(2^{n-1} - 1\)
最小負值:\(-2^{n-1}\)
例子:使用 8 個位元 (\(n=8\))
最大正值:\(2^7 - 1 = 127\)。
最小負值:\(-2^7 = -128\)。
範圍:-128 到 +127。
3.3 將負的十進制數轉換為二補數
逐步技巧(「反轉並加 1」方法):
目標:用 8 位元表示 -5。
- 找出正數的二進制: +5 在 8 位元中為 0000 0101。
-
反轉(Flip)位元: 將所有 0 變為 1,所有 1 變為 0(這稱為一補數)。
0000 0101 變為 1111 1010。 -
對結果加 1:
1111 1010 + 1 = 1111 1011。
這就是 -5 的二補數。(注意 MSB 是 1,表示這是一個負數)。
3.4 使用二補數進行減法
二補數的天才之處在於,減法 (A - B) 等同於加法 (A + (-B))。
例子:計算 12 - 5(以 8 位元表示)
- 表示 12: 0000 1100
- 表示 -5: 1111 1011 (來自 3.3 步驟)
-
將它們相加:
0000 1100 (+12)
+ 1111 1011 (-5)
----------
(1) 0000 0111 (+7)
如果計算結果在分配的位元內,最後的進位位元 (1) 將會被忽略。結果 0000 0111 為 7,是正確的。
重點: 二補數讓電腦能夠表示負數,並透過加法執行減法。MSB 會告訴你符號。
4. 表示小數(3.5.3.4, 3.5.3.8, 3.5.3.9)
為了表示含有小數部分的數字(實數),電腦使用兩種主要方法:定點數(Fixed Point)和浮點數(Floating Point)。
4.1 定點數表示法
在定點數中,二進制小數點的位置是預先設定好的,並且保持「固定」。
- 我們分配固定數量的位元給整數部分(點的左邊),並分配固定數量的位元給分數部分(點的右邊)。
- 小數點右邊使用的冪是負 2 的冪:\(2^{-1}\) (0.5), \(2^{-2}\) (0.25), \(2^{-3}\) (0.125) 等。
例子(4 位元整數,4 位元分數):
1 0 1 1 . 0 1 0 0
\( (8+0+2+1) . (0.25) \) = 11.25
4.2 浮點數表示法(簡化版)
浮點數是電腦版的科學記號表示法(例如:\(6.022 \times 10^{23}\))。二進制小數點可以「浮動」以最大化有效位數的表示。
浮點數由兩個主要部分組成,通常都使用二補數表示:
- 尾數(Mantissa, M): 表示數字的有效位數(精度)。
- 指數(Exponent, E): 表示尾數所乘的 2 的冪(範圍)。
數值計算公式為: \( M \times 2^E \)
4.2.1 範圍 vs. 精度
位元在尾數和指數之間的分配方式決定了系統的能力:
- 精度(Precision): 取決於尾數中的位元數。尾數位元越多,數字表示越精確(捨入誤差越小)。
- 範圍(Range): 取決於指數中的位元數。指數位元越多,儲存極大或極小數字的能力越強。
4.2.2 正規化(Normalisation, 3.5.3.9)
為了確保每個數字都有唯一的表示形式並最大化精度,浮點數必須經過正規化。
為什麼要正規化? 為了將二進制小數點放在一個標準位置,從而消除多餘的零。
正規化規則: 尾數必須以「01...」(對於正數)或「10...」(對於負數)開頭。
如何正規化(過程):
- 移動二進制小數點,直到尾數以 01(正數)或 10(負數)開頭。
- 更新指數以反映你移動小數點的位數。
例子:非正規化正數 001100 \(\times 2^2\)(6 位元尾數,4 位元指數)
1. 將小數點向右移動 1 位:0.1100。
2. 新指數:\(2^2\) 變為 \(2^{2-1} = 2^1\)。
結果:011000 \(\times 2^1\)。(開頭的 0 是符號位元,小數點後的第一個數是 1,以滿足 01... 的條件)。
4.3 比較定點數與浮點數(3.5.3.8)
| 定點數 | 浮點數 | |
| 範圍 | 非常有限。 | 非常大(由指數決定)。 |
| 精度 | 固定,但有限(由分數位元決定)。 | 高(由尾數決定)。 |
| 速度 | 運算較快(算術簡單)。 | 運算較慢(需要複雜硬體來進行移位/正規化)。 |
| 用途 | 簡單財務系統(需固定精度)。 | 科學建模、圖形處理、大規模運算。 |
重點: 浮點數提供了巨大的範圍(指數)和良好的精度(尾數),但對於數值大小差異不大的運算,定點數更簡單且更快速。
5. 表示法的限制與錯誤(3.5.3.5, 3.5.3.6, 3.5.3.7)
5.1 捨入誤差(精度不足, 3.5.3.5)
二進制系統無法精確表示所有十進制分數,就像我們無法在十進制中完美寫出 1/3(它是 0.3333...)一樣。
- 十進制數字(如 0.1)可能需要無限多的二進制位元才能真正精確。
- 由於電腦使用固定位元數(有限精度),它必須對表示進行截斷或捨入,從而導致小的捨入誤差。
5.2 絕對誤差與相對誤差(3.5.3.6)
當運算不精確時,我們需要一種方法來衡量誤差:
-
絕對誤差(Absolute Error): 真值與表示值之間的實際差異。
公式:\( | \text{真值} - \text{存儲值} | \) -
相對誤差(Relative Error): 絕對誤差除以真值(以百分比或分數表示)。這通常更有用,因為它顯示了相對於數字大小的誤差。
公式:\( \frac{\text{絕對誤差}}{\text{真值}} \)
例子:如果真值是 200,絕對誤差 100 是巨大的(50% 相對誤差);但如果真值是 1,000,000,絕對誤差 100 則是微不足道的(0.01% 相對誤差)。
5.3 溢位(Overflow)與下溢(Underflow)
當運算結果超出分配位元所能表示的範圍時,就會發生這些錯誤。
-
溢位(Overflow): 當結果太大(太正或太負),無法儲存在可用位元數中時發生。
想像一下試圖在 8 位元無符號系統(最大值 255)中儲存 300。這就是溢位。
-
下溢(Underflow): 當結果太接近零,無法精確表示時發生,這意味著系統能儲存的最接近表示值為 0。
這通常發生在極小的分數(浮點數)中,指數太小而無法處理。
重點: 電腦使用有限的位元,導致固有的限制(捨入誤差)。溢位和下溢錯誤定義了系統範圍的邊界。
🧠 快速複習清單
- 我會進行二進制、十進制和十六進制之間的轉換嗎?
- 我會計算 n 位元無符號數的範圍嗎?(0 到 \(2^n - 1\))
- 我會計算 n 位元有符號數的範圍嗎?(\(-2^{n-1}\) 到 \(2^{n-1} - 1\))
- 我會使用二補數來表示負數並執行減法嗎?
- 我理解在浮點數中尾數控制精度而指數控制範圍嗎?
- 我能解釋正規化及其必要性嗎?
- 我區分得開溢位(太大)和下溢(太接近零)嗎?
恭喜!你已經掌握了數字如何在電腦內部管理的基礎概念。繼續練習那些轉換和二補數步驟吧!