1.1 數字系統:電腦數據的基礎
哈囉!這一章我們要學習電腦的祕密語言。你螢幕上看到的一切——文字、影像、聲音和數字——都必須先轉化為電腦能理解的電子脈衝序列。這個過程稱為數據表示法 (Data Representation)。
如果數學看起來有點奇怪,別擔心;我們會把每一個轉換過程拆解成簡單易懂的步驟!
為什麼電腦只懂二進制 (Binary, Base 2)
人類使用十進制 (Denary, Base 10) 是因為我們有 10 根手指。但電腦是靠電力運作的,它只需要區分兩種狀態:開 (ON) 或 關 (OFF)。
- 開 (ON) 用數字 1 表示。
- 關 (OFF) 用數字 0 表示。
因為它只使用兩個數字(0 和 1),所以稱為二進制 (Binary)系統(以 2 為底)。
關鍵術語:單個二進制數字(0 或 1)稱為一個位元 (Bit)。電腦會將這些位元儲存在稱為暫存器 (Registers) 的臨時儲存區域中。
快速複習:必須掌握的數字系統
- 十進制 (Denary/Decimal):以 10 為底(使用 0–9)。這是我們日常使用的系統。
- 二進制 (Binary):以 2 為底(使用 0 和 1)。這是電腦的母語。
- 十六進制 (Hexadecimal/Hex):以 16 為底(使用 0–9 和字母 A–F)。這是工程師用來簡化數據的工具。
2. 數字系統之間的轉換
我們需要學會在這些進位制之間切換。請記住:考試不允許使用計算機,所以理解每個位值的權重至關重要!
2.1 十進制 (Base 10) 與二進制 (Base 2) 的轉換
在任何數字系統中,數字的位置決定了它的數值。在二進制中,這些位置是 2 的冪次方。我們通常使用 8 個位元(一個位元組 Byte)來表示,但考試範圍要求最高達到 16 個位元。
8 位元的位值由右至左排列:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
A. 十進制轉正二進制
我們使用減法法。從小於或等於該十進制數字的最大位值開始計算。
範例:將十進制 195 轉換為 8 位元二進制。
- 195 $\ge$ 128 嗎?是的。在 128 下方寫 1。餘數:\(195 - 128 = 67\)。
- 67 $\ge$ 64 嗎?是的。在 64 下方寫 1。餘數:\(67 - 64 = 3\)。
- 3 $\ge$ 32 嗎?不是。寫 0。
- 3 $\ge$ 16 嗎?不是。寫 0。
- 3 $\ge$ 8 嗎?不是。寫 0。
- 3 $\ge$ 4 嗎?不是。寫 0。
- 3 $\ge$ 2 嗎?是的。寫 1。餘數:\(3 - 2 = 1\)。
- 1 $\ge$ 1 嗎?是的。寫 1。餘數:\(1 - 1 = 0\)。
8 位元二進制結果為 11000011。
B. 正二進制轉十進制
只需將位值與二進制數字(0 或 1)相乘,然後將結果加總即可。
範例:將二進制 01010101 轉換為十進制。
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
計算:\((0 \times 128) + (1 \times 64) + (0 \times 32) + (1 \times 16) + (0 \times 8) + (1 \times 4) + (0 \times 2) + (1 \times 1)\)
\(= 0 + 64 + 0 + 16 + 0 + 4 + 0 + 1 = 85\)
十進制結果為 85。
2.2 十進制 (Base 10) 與十六進制 (Base 16) 的轉換
十六進制使用 16 個符號。我們需要為 10 到 15 的數字定義新符號:
A = 10, B = 11, C = 12, D = 13, E = 14, F = 15
A. 十進制轉十六進制
使用除法法,將十進制數字除以 16。
範例:將十進制 250 轉換為十六進制。
- 250 除以 16:\(250 \div 16 = 15\),餘數為 10。
- 將餘數 (10) 轉換為十六進制符號:A。這是最低有效數字 (LSD)。
- 將商 (15) 轉換為十六進制符號:F。這是最高有效數字 (MSD)。
十六進制結果為 FA。
B. 十六進制轉十進制
十六進制的位值是 16 的冪次方(\(16^0=1\),\(16^1=16\),\(16^2=256\),以此類推)。
範例:將十六進制 3F 轉換為十進制。
- 拆分十六進制數字:3 和 F。請記住 F = 15。
- 將位值乘以數字的十進制等效值。
\((3 \times 16) + (F \times 1)\)
\((3 \times 16) + (15 \times 1)\)
\(= 48 + 15 = 63\)
十進制結果為 63。
2.3 十六進制與二進制的轉換(最簡單的部分!)
由於 \(16 = 2^4\),一個十六進制數字剛好可以用 4 個二進制位元(稱為一個半位元組 Nibble)精確表示。這是轉換的「捷徑」。
A. 十六進制轉二進制
將每個十六進制數字轉換為其 4 位元二進制等效值。
範例:將十六進制 A5 轉換為二進制。
- 分開數字:A 和 5。(A 在十進制中為 10)。
- 轉換 A (10) 使用 4 位元權重 (8, 4, 2, 1):\(8+2 = 10 \rightarrow \mathbf{1010}\)
- 轉換 5 使用 4 位元權重 (8, 4, 2, 1):\(4+1 = 5 \rightarrow \mathbf{0101}\)
組合結果:10100101。
B. 二進制轉十六進制
從右邊開始,將二進制數字每 4 個分為一組,然後將每組轉換為一個十六進制數字。
範例:將二進制 11110011 轉換為十六進制。
- 分組:
\(\mathbf{1111} \ \ \ \ \ \ \ \ \mathbf{0011}\) - 轉換左組 (\(1111\)): \(8+4+2+1 = 15\)。十六進制符號為 F。
- 轉換右組 (\(0011\)): \(2+1 = 3\)。十六進制符號為 3。
十六進制結果為 F3。
重點總結:轉換
十六進制只是二進制的便捷捷徑。 如果你需要透過十六進制將十進制轉為二進制(或反之),請使用「十進制 $\leftrightarrow$ 十六進制 $\leftrightarrow$ 二進制」的步驟。捷徑的關鍵永遠是將二進制字串切分為 4 位元一組。
3. 十六進制的用途
3.1 理解其優點
既然電腦用二進制、人類用十進制,為什麼還要用十六進制?
十六進制被視為一種有效的數據表示法,因為:
- 長度更短: 十六進制為冗長的二進制字串提供了更短的表示方式。一個 16 位元的二進制數(如 1101001011110000)變成四個十六進制數(D2F0)。這減少了人類在閱讀或記錄數據時出錯的機率。
- 對人類更友善: 程式設計師閱讀和記憶「A4」比閱讀「10100100」要容易得多。
3.2 電腦科學中十六進制的應用場景
你會在以下幾個領域看到十六進制的蹤影:
- MAC 位址: 網卡唯一的實體位址(如 00-1A-C2-7B-00-47)。
- 記憶體轉儲 (Memory Dumps): 當程式設計師需要檢查記憶體(暫存器或 RAM)的原始內容時,數據會以十六進制顯示,以便閱讀。
- HTML 色碼: 網站顏色通常由六位十六進制數表示(如 #FF0000 代表純紅色)。
4. 二進制算術:加法與溢位 (Overflow)
4.1 兩個正 8 位元二進制整數的加法
二進制加法遵循簡單的規則,只處理 0 和 1:
- \(0 + 0 = 0\)
- \(1 + 0 = 1\)
- \(1 + 1 = 0\),進位 1(就像十進制中 5+5=0 進位 1)
- \(1 + 1 + 1 = 1\),進位 1
範例:將二進制 01010010 (82) 與 00001011 (11) 相加。
進位列: 1 1
01010010 (82)
+ 00001011 (11)
----------
01011101 (93)
4.2 理解溢位 (Overflow) 的概念
當計算結果太大,無法放入分配的儲存空間(暫存器)時,就會發生溢位錯誤。
在 IGCSE 課程中,我們專注於 8 位元暫存器。
- 8 位元暫存器能容納的最大正整數是 11111111(十進制為 255)。
- 如果你相加兩個數字,而結果需要第 9 個位元,就發生了溢位。
溢位範例:相加 150 和 150(兩者皆可放入 8 位元)。結果應該是 300。
進位列: 1 1 1 1 1 1
10010110 (150)
+ 10010110 (150)
----------
$\mathbf{1}\ $ 00101100 (44)
第 9 個位元(粗體)稱為溢位位元。由於暫存器只有 8 個位元的空間,電腦只會儲存 00101100 (44),導致答案錯誤並觸發溢位。
比喻:想像將 300 毫升的果汁倒入一個只能裝 255 毫升的杯子裡。多出來的果汁會溢出,杯子(暫存器)只會保留它能容納的最大限度,錯過了正確結果。
記憶小撇步:溢位
如果十進制總和超過 255,在使用 8 位元暫存器時就會發生溢位。
5. 特殊二進制技術
5.1 邏輯二進制移位 (Logical Binary Shifts)
邏輯二進制移位是一種快速操作,將暫存器中的所有位元向左或向右移動。
執行移位時:
- 移出暫存器邊界的位元會丟失。
- 另一端產生的空位會填入零。
A. 邏輯左移
左移等同於將數字乘以 2 的冪次方。
規則:每向左移動一個位置,數字就乘以 2。
範例:二進制 00000101 (5)。向左移位 2 位。
- 兩個位元 (00) 從右邊移入。
- 兩個最高有效位元 (00) 被移出並丟失。
\(00000101 \rightarrow \mathbf{00010100}\) (十進制 20)。
(原值 5 乘以 \(2^2\),即 4,結果為 20)。
B. 邏輯右移
右移等同於將數字除以 2 的冪次方。
規則:每向右移動一個位置,數字就除以 2。
範例:二進制 00101000 (40)。向右移位 3 位。
- 三個零 (000) 從左邊移入。
- 三個最低有效位元 (000) 被移出並丟失。(這導致整數除法,任何餘數都會被捨棄)。
\(00101000 \rightarrow \mathbf{00000101}\) (十進制 5)。
(原值 40 除以 \(2^3\),即 8,結果為 5)。
你知道嗎?
在乘法和除法運算中,移位速度極快。電腦在組合語言中會使用移位而不是傳統算術,以快速執行這些計算。
5.2 二補數 (Two's Complement):表示負數
到目前為止,我們只討論了正整數 (0 到 255)。電腦如何表示負數?它使用二補數。
二補數允許我們在同一個暫存器中儲存正整數和負整數。
符號位元 (Sign Bit)
當使用二補數(以我們的 8 位元為例):
- 最高有效位元 (MSB)(最左邊的位元,第 128 位)成為符號位元。
- 如果 MSB 是 0,該數為正數。
- 如果 MSB 是 1,該數為負數。
8 位元二補數的表示範圍是 -128 到 +127。
轉換步驟(正十進制轉負二補數)
若要將十進制數(例如 -42)轉換為其 8 位元二補數表示:
第一步:寫出正數的二進制。
\(42 = 00101010\)
第二步:找到一補數 (Flip bits)。
將每個 0 改為 1,每個 1 改為 0。
\(00101010 \rightarrow \mathbf{11010101}\)
第三步:加 1。
11010101
+ 1
----------
\(\mathbf{11010110}\)
-42 的 8 位元二補數為 11010110。(注意 MSB 為 1,表示這是負數)。
轉換步驟(負二補數轉回十進制)
若要將負數二進制(例如 11010110)轉回十進制:
第一步:找到一補數 (Flip bits)。
\(11010110 \rightarrow 00101001\)
第二步:加 1。
00101001
+ 1
----------
00101010
第三步:將得到的正二進制轉換為十進制。
\(00101010 = 32 + 8 + 2 = 42\)
由於原始數字的符號位元為負(1),因此原始數字為 -42。
章節總結:關鍵要點
- 二進制是 Base 2 (0 和 1),因為電腦運作基於電路開/關兩種狀態。
- 十六進制 (Base 16) 是二進制的縮寫,讓長二進制串對人類而言更容易管理(4 位元 = 1 個十六進制數字)。
- 二進制加法在執行 \(1+1\) 時需要進位 1。
- 溢位發生在 8 位元加法結果超過 255 時(會產生第 9 個位元且被丟失)。
- 左移等於乘 2;右移等於除 2。空位填 0。
- 二補數用於表示負數。MSB(最左邊的位元)作為符號位元。