歡迎來到二進制的世界!
你有沒有想過,電腦本質上只是一堆微小的電子開關,它是如何理解像你最喜歡的電子遊戲或數學作業這樣複雜的事物呢?這一切歸根究底,都要歸功於二進制系統 (binary number system)。在本章中,我們將學習這門「0 與 1 的語言」,並了解電腦如何處理從簡單的計數到複雜的小數等各種運算。
3.5.3.1 無符號二進制 (Unsigned Binary)
電腦最基礎的計數方式是使用無符號二進制。「無符號」簡單來說就是指該數值永遠為正數(沒有正負號)。
在一個擁有 n 個位元 (bits) 的二進制系統中(每個位元可以是 1 或 0):
- 最小值永遠是 0(所有位元皆為 0)。
- 最大值使用以下公式計算:\( 2^n - 1 \)。
例子:如果你有 8 個位元(即 1 個字節/byte),你可以表示的最大值是 \( 2^8 - 1 \),即 \( 256 - 1 = 255 \)。因此,一個 8 位元的無符號整數可以表示從 0 到 255 的任何整數。
重點小筆記:
無符號 (Unsigned) = 僅限正數。
範圍 (Range) = \( 0 \) 到 \( 2^n - 1 \)。
3.5.3.2 無符號二進制算術
二進制的加法和乘法與你在小學學到的十進制運算非常相似,只是需要處理的數字更少,更簡單!
二進制加法規則:
- \( 0 + 0 = 0 \)
- \( 0 + 1 = 1 \)
- \( 1 + 1 = 10 \)(寫 0,進位 1)
- \( 1 + 1 + 1 = 11 \)(寫 1,進位 1)
二進制乘法:
二進制乘法甚至更簡單,因為你只需要處理 0 或 1。它其實就是一系列的位移 (shifts) 和加法。如果你乘以 1,就直接複製該數字;如果乘以 0,結果當然就是 0。
冷知識:
將二進制數乘以 2,只需在末尾加一個 0 即可!這被稱為邏輯左移 (logical shift left)。
3.5.3.3 使用二補數 (Two's Complement) 的有符號二進制
如果我們需要表示負數怎麼辦?我們使用一種稱為二補數 (Two's Complement) 的系統。在這個系統中,最高有效位 (most significant bit)(即最左邊的那一位)代表一個負值。
8 位元例子:各個位元的權重不再是 128, 64, 32... 而是變成 -128, 64, 32, 16, 8, 4, 2, 1。
如何將正數轉換為負數:
如果覺得有點繞口別擔心!只需遵循以下兩個簡單步驟:
- 反轉 (Flip) 所有位元(將 1 變為 0,0 變為 1)。
- 將結果加 1。
二補數的範圍:
對於 n 個位元,範圍是:\( -2^{n-1} \) 到 \( +2^{n-1} - 1 \)。
以 8 位元為例,範圍就是 -128 到 +127。
核心觀念:二補數讓我們可以透過「加上一個負數」來執行減法。要計算 \( 5 - 3 \),電腦實際上是在計算 \( 5 + (-3) \)。
3.5.3.4 帶有小數部分的數值
電腦不僅處理整數,也需要處理小數!這主要有兩種方式:
1. 定點數 (Fixed Point)
二進制小數點在數值中處於「固定」位置。例如在一個 8 位元的數值中,我們可能規定 4 位元用於整數部分,4 位元用於小數部分。
類比:想像一個價錢標籤,小數點永遠在倒數第二位之後(例如 $99.99)。這種方式很簡單,但不容易表示極大或極小的數字。
2. 浮點數 (Floating Point)
這類似於科學記號表示法(例如 \( 6.02 \times 10^{23} \))。它包含兩個部分:
- 尾數 (Mantissa):數值本身的有效數字。
- 指數 (Exponent):告訴我們二進制小數點「浮動」到哪裡。
在考試中,這兩個部分通常都會使用二補數來表示。
關鍵概念:
- 尾數位元越多 = 精度 (Precision) 越高(小數位越多)。
- 指數位元越多 = 範圍 (Range) 越大(可以表示更大或更小的數字)。
3.5.3.9 正規化 (Normalisation)
為了確保我們能從位元中獲得最高的精度,我們會對浮點數進行正規化。正規化的數字開頭永遠是:
- 正數以 01 開頭。
- 負數以 10 開頭。
這樣做可以確保我們不會浪費位元在無意義的前導零(或負數的前導一)上。
3.5.3.5 & 3.5.3.6 二進制運算的誤差
電腦運算速度極快,但在數學上並不總是精確的!有些十進制小數(例如 0.1)在二進制中是無法精確表示的。這會導致捨入誤差 (rounding errors)。
測量誤差:
- 絕對誤差 (Absolute Error):真實數值與二進制表示數值之間的實際差值。\( |真實值 - 表示值| \)
- 相對誤差 (Relative Error):絕對誤差除以真實值。這通常更有用,因為它顯示了誤差相對於數值本身大小的重要性。
例子:如果你擁有 $10 時掉了 $1,這是一個巨大的誤差 (10%)。但如果你擁有 $1,000,000 時掉了 $1,那是一個極小的誤差 (0.0001%)。相對誤差告訴我們,第二種情況的誤差是可以接受的!
3.5.3.7 下溢 (Underflow) 與上溢 (Overflow)
當計算結果超出位元所能承載的極限時,就會發生這種情況。
- 上溢 (Overflow):結果太大,無法放入分配的位元中(就像試圖將 1000 塞進只有 3 位的空間)。
- 下溢 (Underflow):結果太小(太接近零),無法精確表示。這常發生在浮點數中,當指數變得過小時。
3.5.3.8 定點數與浮點數的比較
以下是總結,幫助你記住兩者的區別:
定點數 (Fixed Point):
- 優點:電腦處理速度較快(數學運算較簡單)。
- 缺點:數值範圍非常有限。
浮點數 (Floating Point):
- 優點:範圍極大(可以表示原子的微小尺寸到星系間的距離)。
- 缺點:處理速度較慢;且容易產生更複雜的精度問題。
總結:若追求速度且數值範圍固定(如處理貨幣),請選擇定點數;若需進行複雜的科學計算且涉及極大或極小的數值,請選擇浮點數。