【計算機組織與結構】初步認識計算機世界的數字系統

一個筆記性質的文章,想到什麼寫什麼。

  • 數值(Numeric)
  • 數碼(Code) 如:ASCII,Big-5,UTF-8

什麼是UTF-8?與Unicode的差別?

  • Unicode 是字符集;UTF-8 是編碼。
  • UTF-8是為了解決向下相容ASCII碼而設計的。
  • Unicode中前128個字元與ASCII碼一一對應。
  • ASCII是UTF-8的子集。

延伸閱讀:Unicode 与 UTF8,16,32什么意思以及之间的联系


計算機的基本儲存單位是「位元(bit)」,通過開關變化設置表達值0或1。在有兩個位元的情況下可以得到四個不同的狀態:

00 01 10 11

如果有三個位,則有八種狀態:

000 001 010 011 100 101 110 111

每當增加一個位時,將得到兩倍的狀態。

電腦常以8個位元為存取單位,因此8個位元稱為「位元組(byte)」。

計算機常用單位

延伸閱讀二、八、十與十六進位 (數字系統) 轉換教學

在計算機世界中 A-B = A+(-B)

那你可能會好奇,減法直接減就好了,為什麼要用加法計算減法?

那是因為加法需要「加法器」,那麼減法也就需要「減法器」。

  對於早期的機械計算設備而言,加法器是依靠「齒輪」等機械器件實現的。如果人們強行實現減法器,則需要在同一台設備中增加更多齒輪、軸承、連杆等機械器件,導致設備體積增大、成本上升、故障率升高,這是不划算的。

  類似的,對於現代數字電子計算機(各種電腦)來說,雖然其體積遠比當年的機械計算機小,但增加一個「減法器」,將要求工程師在晶片上增加更多電晶體以及相關電路,這會增大晶片面積、功耗和一系列開銷,導致晶片成本升高。

因此,為了降低不必要的成本,工程師和科學家想了一招:

能否將加法和減法都統一於「加法」?

這樣一來,只需一台擁有「加法」功能的機器,就可以既算加法,也能算減法。

這就是人們在計算機底層使用補碼的原因。


有號數表示法

而常見的有符號數表示法有以下幾種:

sign & magnitude(S&m)

  分配一個符號位(sign bit)來表示這個符號:設定這個位(通常為最高有效位)為0表示一個正數,為1表示一個負數。

  數字中的其它位指示數值(或者絕對值)。因此一個位元組只有7位(除去符號位),數值的範圍從0000000(0)到1111111(127)。這樣當你增加一個符號位(第八位)後,可以表示從−127(10)到+127(10)的數字。

  這種表示法導致的結果就是可以有兩種方式表示零,00000000(0)與10000000(−0),這大大增加數位電路的複雜性和設計難度。CPU亦須執行兩次比較,來測試運算結果是否為零。

Ones’ complement

  一個負數的二進位數一補數形式為其絕對值部分按位元取反(即符號位不變,其餘各位按位元取反)。同原碼表示一樣,0的一補數表示形式也有兩種:00000000(+0)與11111111(−0)

  舉例來說,原碼10101011(-43)的一補數形式為11010100(−43)。有符號數用一補數表示的範圍為−(2^(N−1)−1)到(2^(N−1)−1),以及+/−0。一個慣常的八位的位元組便是(可表示)−127(10)到+127(10),以及00000000(+0)或者11111111(−0)。

溢位需做端迴進位。

Two’s complement

迴避了0有多種表示的問題以及迴圈進位的需要(溢位不需要做端迴進位)。

在二補數表示中,負數以位元型樣表示為正值的一補數加1(當作無符號數)。

在二補數表示中,只有一個0(00000000)。求一個數的二補數(無論是負數還是正數)需要反轉所有位,然後加1。

可藉由最後一bit是否為1判斷是否為奇數。


下表列出了 4-bit 二進數所能表示的整數:

  • 無符號(unsigned)可表示0到15
  • 符號及值(sign & magnitude)可表示-7到+7,包括-0
  • 一補數(ones’ complement)可表示-7到+7,包括-0
  • 二補數(two’s complement)可表示-8到+7,沒有±0的問題

延伸閱讀ASCII

浮點數表示法

實數(Real)

 包含整數部分和小數部分的數值,例如23.7是一個實數,整數部分為23,小數部分是0.7。位數不足會造成精確度及正確度誤差。

  在浮點數表示法中,一個數值是由三個欄位組成:「符號」非正即負;「位移量」顯示小數點應從實際數值往左或右移多少單位(指數形式);「定點數」小數點位置是固定的。

科學記號(Scientific Notation)

浮點數表示法的一種。

正規化(Normalization)

將數值轉為小數點左方僅有一個非零數字

* 十進位科學記號:

± d.xxxxxxxx (d = 1 ~ 9, x = 0 ~ 9)

* 二進位浮點數:

± 1.yyyyyyyy (y = 0, 1)

符號、指數和尾數

* 二進位浮點數儲存 3 項資訊:符號、指數、和尾數

* 例如:+1000111.0101 → +1.0001110101×26 → 儲存:符號(+)、指數(6)、及尾數(0001110101)

* 符號:使用一個位元(0, 1)表示

* 指數:使用超碼表示法(Excess)

* 尾數:使用定點數表示法

超碼系統(Excess system)

* 將整數加一個偏移值(Bias):2^(m–1) –1 (m 為儲存指數的記憶體大小)

→ 正負整數均轉為正整數

# 例如:

– m = 8 (偏移=127):超 127 系統(Excess_127 system)

– m = 11 (偏移=1023):超 1023 系統(Excess_1023 system)

* 表示程序:

# 將指數加上偏移值

# 將結果轉為二進位,若位元<m,左邊補 0 直到位元=m

* 例如,以 Excess_127 系統表示–25(10):

 → –25 + 127 = 102 → 110 0110 → 0110 0110

* 為何使用超碼系統來表示指數?

# 將兩個浮點數相加或相減時,指數僅用於比較大小(不需相加或相減)

 → 不需要使用 2 補數

# 超碼系統都是正數

 → 比較大小較為快速(不需考慮正負數)

IEEE 754標準

單倍精準數
• 符號位元:1個位元,以0表示正數;以1表示負數
• 指數部分:8個位元,以超127(Excess 127)方式表示
• 尾數部分:23個位元,從標準化的小數點開始存起,不夠的位元部份補0

  給定一實數10110.100011,先轉換成1.0110100011*2^4,因為是正數,所以符號位元為0,其尾數部分為小數點後0110100011,指數部分為4,以超127方式儲存,因此將指數部分加上127 = 4+127 = 131,再將131轉為二進位得10000011
因此10110.100011按IEEE-754標準儲存為:
0 10000011 01101000110000000000000

  也可以透過轉換後的推回原來的數值,例如0 10000101 00101000110000000000000所儲存的數值為多少?
首先,位元符號為0,所以是正數,指數部分為10000101換成十進位為133,133-127=6,因此0 10000101 00101000110000000000000所儲存的數值為1.0010100011*2^6 也就是1001010.0011

單精度與倍精度的差別

為了讓誤差更小,IEEE 754 也定義了如何用 64 bit 來表示浮點數,跟 32 bit 比起來 fraction 部分大了超過兩倍,從 23 bit 變成 52 bit,所以精準度自然提高許多

從IEEE 754 標準來看為什麼浮點誤差是無法避免的- StarBugs Weekly 星 ...

IEEE754線上轉換器:https://www.h-schmidt.net/FloatConverter/IEEE754.html

最後更新時間:

相關文章

發表留言