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 位元二進制。

  1. 195 $\ge$ 128 嗎?是的。在 128 下方寫 1。餘數:\(195 - 128 = 67\)。
  2. 67 $\ge$ 64 嗎?是的。在 64 下方寫 1。餘數:\(67 - 64 = 3\)。
  3. 3 $\ge$ 32 嗎?不是。寫 0
  4. 3 $\ge$ 16 嗎?不是。寫 0
  5. 3 $\ge$ 8 嗎?不是。寫 0
  6. 3 $\ge$ 4 嗎?不是。寫 0
  7. 3 $\ge$ 2 嗎?是的。寫 1。餘數:\(3 - 2 = 1\)。
  8. 1 $\ge$ 1 嗎?是的。寫 1。餘數:\(1 - 1 = 0\)。

8 位元二進制結果為 11000011

B. 正二進制轉十進制

只需將位值與二進制數字(0 或 1)相乘,然後將結果加總即可。

範例:將二進制 01010101 轉換為十進制。

1286432168421
01010101

計算:\((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 轉換為十六進制。

  1. 250 除以 16:\(250 \div 16 = 15\),餘數為 10。
  2. 將餘數 (10) 轉換為十六進制符號:A。這是最低有效數字 (LSD)
  3. 將商 (15) 轉換為十六進制符號:F。這是最高有效數字 (MSD)

十六進制結果為 FA

B. 十六進制轉十進制

十六進制的位值是 16 的冪次方(\(16^0=1\),\(16^1=16\),\(16^2=256\),以此類推)。

範例:將十六進制 3F 轉換為十進制。

  1. 拆分十六進制數字:3 和 F。請記住 F = 15。
  2. 將位值乘以數字的十進制等效值。
    \((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 轉換為二進制。

  1. 分開數字:A 和 5。(A 在十進制中為 10)。
  2. 轉換 A (10) 使用 4 位元權重 (8, 4, 2, 1):\(8+2 = 10 \rightarrow \mathbf{1010}\)
  3. 轉換 5 使用 4 位元權重 (8, 4, 2, 1):\(4+1 = 5 \rightarrow \mathbf{0101}\)

組合結果:10100101

B. 二進制轉十六進制

從右邊開始,將二進制數字每 4 個分為一組,然後將每組轉換為一個十六進制數字。

範例:將二進制 11110011 轉換為十六進制。

  1. 分組:
    \(\mathbf{1111} \ \ \ \ \ \ \ \ \mathbf{0011}\)
  2. 轉換左組 (\(1111\)): \(8+4+2+1 = 15\)。十六進制符號為 F
  3. 轉換右組 (\(0011\)): \(2+1 = 3\)。十六進制符號為 3

十六進制結果為 F3

重點總結:轉換

十六進制只是二進制的便捷捷徑。 如果你需要透過十六進制將十進制轉為二進制(或反之),請使用「十進制 $\leftrightarrow$ 十六進制 $\leftrightarrow$ 二進制」的步驟。捷徑的關鍵永遠是將二進制字串切分為 4 位元一組。

3. 十六進制的用途

3.1 理解其優點

既然電腦用二進制、人類用十進制,為什麼還要用十六進制?

十六進制被視為一種有效的數據表示法,因為:

  1. 長度更短: 十六進制為冗長的二進制字串提供了更短的表示方式。一個 16 位元的二進制數(如 1101001011110000)變成四個十六進制數(D2F0)。這減少了人類在閱讀或記錄數據時出錯的機率。
  2. 對人類更友善: 程式設計師閱讀和記憶「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(最左邊的位元)作為符號位元。