歡迎來到數據類型世界!
你好!今天我們要深入探討電腦科學的「原子」:數據類型 (Data Types)。就像煮飯前必須知道食材是液體還是固體一樣,電腦如果不清楚正在處理什麼類型的數據,就無法進行運算。
在本指南中,我們將探索電腦如何儲存數字、文字和邏輯。如果有些二進制數學看起來像《廿二世紀殺人網絡》般深奧,別擔心——我們會一步一步為你拆解!
1. 五大基礎數據類型 (The "Big Five" Primitive Data Types)
基礎數據類型 (Primitive data type) 是程式語言提供的基本建構組件。你可以把它們想像成不同形狀的盒子,每個盒子只能存放特定類型的物品。
- 整數 (Integer):沒有小數部分的完整數字(例如:-5, 0, 42)。
- 實數/浮點數 (Real / Floating Point):帶有小數部分的數字(例如:3.14, -0.01)。
- 字符 (Character):單一的字母、數字或符號(例如:'A', '!', '3')。
- 字串 (String):由多個字符組成的序列,通常用於單詞或句子(例如:"Hello World")。
- 布林值 (Boolean):只有兩個值:真 (True) 或 假 (False)。
小測驗:如果你要儲存某人的年齡,你會使用 整數 (Integer);如果你要儲存他們的身高(米),則會使用 實數 (Real)!
2. 正整數的表示法
電腦使用 二進制 (Binary, 基數 2),只使用 0 和 1。這是因為電腦硬件是由無數個微小的開關組成的,這些開關只有關閉 (0) 或開啟 (1) 兩種狀態。
十進制轉二進制
要將十進制數字轉換為二進制,我們使用每位數遞增的權重:128, 64, 32, 16, 8, 4, 2, 1。
範例:將 13 轉換為二進制。
1. 8 能放入 13 嗎?可以。(13 - 8 = 5)。在 8 的位置下方放 1。
2. 4 能放入 5 嗎?可以。(5 - 4 = 1)。在 4 的位置下方放 1。
3. 2 能放入 1 嗎?不行。在 2 的位置下方放 0。
4. 1 能放入 1 嗎?可以。在 1 的位置下方放 1。
結果:\(00001101\)
十六進制 (Hexadecimal, 基數 16)
二進制對人類來說很難閱讀。十六進制是一種簡寫方式,使用 0-9 以及 A, B, C, D, E, F 來代表 10-15 的值。
為什麼要用十六進制?一個十六進制數字剛好代表 4 個位元(一個 nibble)。記住 #FF0000 遠比記住長長的一串 0 和 1 要容易得多!
3. 二進制中的負數
電腦如何知道一個數字是負數呢?我們主要有兩種方法:
符號與數值法 (Sign and Magnitude)
這是最簡單的方法。我們使用 最高有效位元 (MSB)(即最左邊的那一位)作為「標記」。
- 如果 MSB 是 0,該數字為 正數。
- 如果 MSB 是 1,該數字為 負數。
範例:如果 \(00001101\) 是 +13,那麼 \(10001101\) 就是 -13。
問題:電腦以這種方式運算很困難,而且會出現「負零」(\(10000000\)) 的狀況,這會造成混亂!
二補數 (Two's Complement)
這是專業的處理方式。MSB 具有 負值。在 8 位元數字中,最左邊的位元代表 -128 而非 +128。
「反轉並加 1」技巧:
將 +5 變為 -5:
1. 先寫出 +5: \(00000101\)
2. 反轉所有位元 (NOT): \(11111010\)
3. 加 1: \(11111011\)
現在,如果你將這些值相加:\(-128 + 64 + 32 + 16 + 8 + 2 + 1 = -5\)。成功了!
4. 二進制算術
二進制加法就像普通加法一樣,但只要加到 2 就需要「進位」。
加法規則:
- \(0 + 0 = 0\)
- \(0 + 1 = 1\)
- \(1 + 1 = 0\) (進 1)
- \(1 + 1 + 1 = 1\) (進 1)
常見錯誤:溢位 (Overflow)!
如果你將兩個數字相加,結果需要 9 位元,但你只有一個 8 位元的「盒子」,多出來的位元就會遺失。這就是 溢位錯誤 (Overflow Error),它會導致程式崩潰或出現異常行為。
5. 浮點數 (小數)
在 A Level 電腦科學中,我們使用 尾數 (Mantissa) 和 指數 (Exponent) 來表示小數。
想像成科學記數法:\(Mantissa \times 2^{Exponent}\)。
正規化 (Normalization)
為了確保數字擁有最大的精確度,並且只有一種表示方式,我們對其進行 正規化。
- 正規化後的 正數 總是以 01 開頭。
- 正規化後的 負數 總是以 10 開頭。
類比: 正規化就像是規定必須寫成 "1.23 x 10²" 而不是 "12.3 x 10¹" 或 "0.123 x 10³"。這樣能保持數據整潔!
6. 位元運算 (Bitwise Manipulation)
有時我們需要檢查個別位元,這時會用到 邏輯遮罩 (Logical Masks)。
- AND:用於 提取 或 清除 位元。(兩者皆為 1 時結果才為 1)。
- OR:用於 設定 位元(強制變為 1)。(只要有一個為 1 時結果即為 1)。
- XOR:用於 反轉 位元。(兩者不同時結果為 1)。
位元移位 (Bitwise Shifts)
- 邏輯左移 (Logical Shift Left):將位元向左移動,右側補 0。效果:乘以 2。
- 邏輯右移 (Logical Shift Right):將位元向右移動。效果:除以 2(捨去餘數)。
7. 字符集:ASCII 和 Unicode
電腦是如何將 \(01000001\) 變成字母 'A' 的呢?我們使用 字符集 (Character Set),這是一個對照表。
ASCII:
- 使用 7 或 8 個位元。
- 可表示 128 或 256 個字符。
- 對英文來說足夠,但對其他語言則不足。
Unicode:
- 使用 16 或 32 個位元。
- 可表示數以百萬計的字符。
- 涵蓋所有語言、科學符號,甚至是 表情符號 (Emojis)! 🍕
關鍵總結: Unicode 是現代標準,因為它是全球通用的;而 ASCII 則非常受限。
總結清單
在繼續學習之前,確保你能做到以下事項:
- [ ] 列出 5 種基礎數據類型。
- [ ] 進行十進制、二進制和十六進制之間的轉換。
- [ ] 解釋為什麼二補數比符號與數值法更好。
- [ ] 執行二進制加法並識別溢位。
- [ ] 描述尾數和指數的作用。
- [ ] 說明 ASCII 和 Unicode 的區別。
如果現在覺得浮點數運算有點困難,別擔心。多練習畫出位元權重表,很快就會變得很順手了!你絕對沒問題!