You are on page 1of 26

第 3章 資料的儲存

(a) 資料型態
- 資料型態(Data type):資料的各種形式
# 數值、文字、音訊、圖像、視訊 → 綜合稱為「多媒體」(Multimedia)
- 電腦裡的資料
* 既然電腦是通用→ 資料應該有統一表示法:位元樣式(Bit pattern)
* 位元(Bit, 0 或 1):能儲存在電腦裡資料的最小單元
* 位元樣式(位元字串):表示資料的序列位元
# 例如:0100 00012 (6510) → ‘A’
* 位元組(Byte):8 位元,字組(Word):較長位元(各系統定義不同)
* 不同資料型態可以相同位元樣式存在電腦記憶體內
3-1
65 程式 01000001
一個數值 程式 (( 數學常式
數學常式 )) 記憶體

鍵盤輸入 'A' 程式
程式 (( 文字編輯器
文字編輯器 )) 01000001

部份圖像 程式
程式 (( 圖像記錄器
圖像記錄器 )) 01000001

部份歌曲 程式 01000001
程式 (( 音樂記錄器
音樂記錄器 ))
程式 01000001
部份電影 程式 (( 視訊記錄器
視訊記錄器 ))

# 記憶體並不知道一個位元樣式代表何種資料
- 由相關的軟體來決定
- 當資料進入電腦時會被編碼,顯示給使用者看時則會被解碼
- 使用錯誤的應用程式來讀取位元樣式 → 亂碼

(b) 儲存 整 數 (Storing integers)


- 無號整數表示法(Unsigned integer)

3-2
* 數值:0 或正數,n 位整數可表示之數值範圍:0 ~ 2n–1
* 表示程序(Representation procedure):
1. 轉為二進位
2. 若位數小於 n,左邊補 0 直到 n 位數
* 範例:儲存 258 至 16 位元的記憶體中
1. 轉二進位:258 → 1 0000 00102 (9 位數)
2. 左邊補 7 個 0 至 16 位數:0000 0001 0000 00102
* 溢位:儲存大於 2n–1 的數值,從 0 開始循環
1110 1111 0000
n=4 1101 0001
14 15 0
13 1
1100 0010
12 2
可表示的正數 溢位
1011 11 3 0011
0 1 2 3 4 ... 15 16 17 18 19 ... 10 4
1010 9 5 0100
8 7 6
1001 0101
1000 0110
0111

3-3
- 符號大小整數表示法(Sign-and-magnitude integer)
* 應用於儲存實數中的整數部分
* 1 個位元表示正負(0:正數,1:負數),其餘位元表示數值大小
* n 位數可表示之數值範圍:–(2n-1–1) ~ (2n-1–1)
# 例如(n = 8):–127 ~ 127
* 0 有兩種表示法(+0,–0):0000 0000 及 1000 0000 (n=8)
* 表示程序:
# 忽略符號,轉為二進位
# 如果位元小於 n,在左邊補 0 直到總位數 = n–1
# 若為正數,最左邊再加 0,否則再加 1
* 例如(n = 8):–4510 = –10 11012 = 1010 11012
* 數值加減無法直接運算
# 例如:310 + (–4)10 = 0000 00112 + 1000 01002 = 1000 01112 (–7) ≠ –1

3-4
* 溢位
# 正溢位:儲存大於 2n-1–1 的數值,從–0 開始循環(數值漸減)
# 負溢位:儲存小於–(2n-1–1)的數值,從+0 開始循環(數值漸增)
負溢位 可表示的負數 可表示的正數 正溢位

n=4 –10 –9 –8 ... –3 –2 –1 ±0 1 2 3 ... 7 8 9 10 ...

1110 1111 0000 1110 1111 0000


1101 0001 1101 0001
–6 –7 +0 –6 –7 +0
–5 1 –5 1
1100 0010 1100 0010
–4 2 –4 2
1011 –3 3 0011 1011 –3 3 0011
–2 4 –2 4
1010 0100 1010 0100
–1 5 –1 5
–0 7 6 –0 7 6
1001 0101 1001 0101
1000 0110 負溢位 1000 0110 正溢位
0111 0111

- 1 補數表示法(One’s complement)

3-5
* 表示程序
# 忽略符號,轉為二進位
# 如果位元小於 n,在左邊補 0 直到總位數 = n
# 若是正數,不作進一步處理;若為負數,則將所有位元反轉
(Complement):A → A
* 最左邊的位元,0:正數,1:負數
* 可表示之數值範圍:–(2n–1–1) ~ 2n–1–1
# 例如,n = 8: –127 ~ 127,n = 16:–32,767 ~ 32,767
* 例如:–4510 = –10 11012 → –0010 1101 → 1101 0010
* 轉十進位程序
# 如果最左邊位元是 0,直接轉十進位;如果最左邊位元是 1,先進行
1 補數運算,再轉十進位
- 例如:–2810 → –1 11002 → –0001 1100 → 1110 0011

3-6
- 轉十進位:1110 0011 (左位元為 1) → –0001 1100 → –2810
* 優點:通訊過程中容易進行錯誤偵測
* 早期計算機使用,但目前計算機較少使用,因為:
# 相加或相減無法直接運算,例如:
3 + (–4) = 0000 0011 + 1111 1011 = 1111 1110 (–1)
3 + (–2) = 0000 0011 + 1111 1101 = 0000 0000 (0) ≠ 1
(最後的進位需再加回計算結果)
# 0 有兩種表示法(+0, –0):0000 0000 及 1111 1111 (n = 8)
- 2 補數表示法(Two’s complement)
* 表示程序
# 忽略符號,轉為二進位
# 如果位元小於 n,在左邊補 0 直到總位數 = n
# 若是正數,不作進一步處理;若為負數,從右邊開始複製位元直到第
一個 1 為止,然後反轉其餘位元,亦即為正數 A 的負數為 A+1
3-7
- 為何? → 如此此一個負數與其正數相加才會等於 0 (A+A+1=0)
- 例如:20 = 0001 01002,欲使 20 + (–20) = 0000 0000:
0001 0100 (20)
+ ???? ???? (–20) → 1110 1100 (= 1110 1011 + 1)
0000 0000
* 因 A 稱為 1 補數,故 A+1 稱為 2 補數
* 最左邊的位元,0:正數,1:負數
* 可表示之數值範圍:–2n-1 ~ 2n-1–1
# 例如,n = 8:–128 ~ 127,n = 16:–32,768 ~ 32767
* 例如:–2810 = –1 11002 → –0001 1100 → 1110 0100
* 轉十進位程序
# 如果最左邊位元是 0,直接轉十進位;如果最左邊位元是 1,先進行
2 補數運算,再轉十進位
- 例如:–2810 → –1 11002 → –0001 1100 → 1110 0100

3-8
- 轉十進位:1110 0100 (左位元為 1) → –0001 1100 → –2810
* 廣泛地應用在目前的計算機,因為:
# 相加或相減可直接運算,例如:
3 + (–4) = 0000 0011 + 1111 1100 = 1111 1111 (–1)
3 + (–2) = 0000 0011 + 1111 1110 = 0000 0001 (1)
–1 + (–127) = 1111 1111 + 1000 0001 = 1000 0000 (–128)

# 0 只有一種表示法:0000 0000 (n = 8)
* 溢位
# 正溢位:儲存大於 2n-1–1 的數值,從–8 開始循環(數值漸增)
# 負溢位:儲存小於–2n-1 的數值,從+7 開始循環(數值漸減)

3-9
負溢位 可表示的負數 可表示的正數 正溢位

n=4 –10 –9 –8 ... –3 –2 –1 0 1 2 3 ... 7 8 9 10 ...

1110 1111 0000 1110 1111 0000


1101 0001 1101 0001
–2 –1 0 –2 –1 0
–3 1 –3 1
1100 0010 1100 0010
–4 2 –4 2
1011 –5 3 0011 1011 –5 3 0011
–6 4 –6 4
1010 0100 1010 0100
–7 5 –7 5
–8 7 6 –8 7 6
1001 0101 1001 0101
1000 0110 負溢位 1000 0110 正溢位
0111 0111

- 各種種系統比較(n = 4)
記憶體內 無號 符號大小 1 補數 2 補數

0000 0 +0 +0 0
0001 1 1 1 1
0010 2 2 2 2
0011 3 3 3 3
0100 4 4 4 4

3-10
0101 5 5 5 5
0110 6 6 6 6
0111 7 7 7 7
1000 8 –0 –7 –8
1001 9 –1 –6 –7
1010 10 –2 –5 –6
1011 11 –3 –4 –5
1100 12 –4 –3 –4
1101 13 –5 –2 –3
1110 14 –6 –1 –2
1111 15 –7 –0 –1

(c) 儲存實數 (Storing reals)


- 實數:含整數及小數
* 位數不足會造成精確度及正確度誤差
* 精確度誤差
# 例如:整數 4 位,小數 2 位,1.23456 → 1.23 (差 0.00456)

3-11
* 正確度誤差
# 例如:整數 4 位,小數 2 位,1234567.89 → 4567.89 (差 1,230,000)
- 浮點數表示法(Floating-point representation)
* 小數點可以浮動:小數點左邊和右邊的位數可以變動
* 數值由 3 個欄位組成:符號、位移量、定點數
# 符號:正數或負數
# 位移量:相對實際數值,小數點向左或向右移動的量
# 定點數:小數點位置固定的數值表示法
- 十進位科學記號(Scientific notation)
* 位移量:10 的次方數
* 定點數:小數點左方僅有一個數字(非 0)
* 例如:7,425,000,000,000,000,000,000.00 → +7.425×1021
# 符號:+
3-12
# 位移量:21 (由原始位置向左移動了 21 位數)
# 定點數:7.425
# 亦可表示為:+7.425E21
* 例如:0.00000232 → –2.32×10–6 (–2.32E–6)
- 二進位浮點數
* 位移量:2 的次方數
* 定點數:小數點左方僅有一個數字(非 0)
* 例如:+10100100000.002 → +1.01001×210
# 符號:+
# 位移量:10 (由原始位置向左移動了 10 位數)
# 定點數:1.01001
* 例如:–0.000001012 → –1.01×2–6
- 正規化(Normalization):將數值轉為小數點左方僅有一個非零數字
3-13
* 十進位科學記號:± d.xxxxxxxx (d = 1 ~ 9, x = 0 ~ 9)
* 二進位浮點數:± 1.yyyyyyyy (y = 0, 1)
- 符號(Sign)、指數(Exponent)、和尾數(Mantissa)
* 二進位浮點數儲存 3 項資訊:符號、指數、和尾數
* 例如:+1000111.0101 → +1.0001110101×26 → 儲存:符號(+)、指
數(6)、及尾數(0001110101)
* 符號:使用一個位元(0, 1)表示
* 指數:使用超碼表示法(Excess)
* 尾數:使用定點數表示法
- 超碼系統(Excess system)
* 將整數加一個偏移值(Bias):2m–1–1 (m 為儲存指數的記憶體大小)
→ 正負整數均轉為正整數

3-14
正、負整數數值

–7 –6 –5 –4 –3 –2 –1 0 1 2 3 4 5 6 7 8
m=4 加7
超 7 系統

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

# 例如:
- m = 8 (偏移=127):超 127 系統(Excess_127 system)
- m = 11 (偏移=1023):超 1023 系統(Excess_1023 system)
* 表示程序:
# 將指數加上偏移值
# 將結果轉為二進位,若位元數小於 m,左邊補 0 直到位元數等於 m
* 例如,以 Excess_127 系統表示–2510:
→ –25 + 127 = 102 → 110 0110 → 0110 0110

3-15
* 為何使用超碼系統來表示指數?
# 將兩個浮點數相加或相減時,指數僅用於比較大小(不需相加或相減)
→ 不需要使用 2 補數
# 超碼系統都是正數
→ 比較大小較為快速(不需考慮正負數)

- 電機電子工程協會標準(Institute of Electrical and Electronic Engineers


standard, IEEE)
* 分為單精準度(32 位元)及雙精準度(64 位元)兩種格式
單精準度 1 8 23
( 超 127) : s 指數 尾數

雙精準度 1 11 52
( 超 1023) : s 指數 尾數

* 儲存三項資料:符號、指數、及尾數

3-16
# 符號(S):1 位元(0 為正,1 為負)
# 指數(E)
- 單精準度:8 位元(超 127 系統:–127 ~ 128 )
- 雙精準度:11 位元(超 1023 系統:–1023 ~ 1024)
# 尾數(M)
- 單精準度:23 位元
- 雙精準度:52 位元
# 特殊值(單精準度)
- 正負零:S = 0 或 1,E = 0,M = 0
- 正負無限大:S = 0 或 1,E = 255,M = 0
- 正負最大值:S = 0 或 1,E = 255,M = 全為 1
- 正負最小值:S = 0 或 1,E = 0,M = 1 (→ ±2–149)
* 表示程序

3-17
# 儲存符號(S)
# 將整數及小數均轉為二進位並正規化
# 以超碼系統表示指數(E)
# 若有需要,尾數(M)右邊補 0
# 連結 S、E、M
* 例如:以單精準度表示–81.7812510
# 符號(–):1
# 整數(81):101 0001,小數(0.78125):0.1100 1
# 正規化:101 0001.1100 1 → +26 × 1.0100 0111 001
# 指數(6):6 + 127 = 133 → 1000 0101
# 尾數(0100 0111 001):0100 0111 0010 0000 0000 000 (右邊補 0)
# 結果:1 1000 0101 0100 0111 0010 0000 0000 000
* 例如:將 1 1001 0100 0000 0000 1110 0010 0001 111 轉為十

3-18
進位數值
# 符號為負
# 指數:1001 01002 → 14810 → 148–127 = 21
# 數值反正規化:1. 0000 0000 1110 0010 0001 111 × 221
→ 10 0000 0001 1100 0100 0011. 112
# 轉十進位再加上符號:–2104378.7510
- 捨棄誤差(Truncation error)
* 原始數值的位數大於浮點數表示法的位數,多於位數會被捨棄,
造成誤差
(d) 儲存文字 (Storing text)
- 英文
*符號:A, B, C, …, Z, a, b, c, …, z, 0, 1, 2, …, 9, !, @, -, $, %, …

3-19
* 符號總數量< 256 (= 28) → 使用 1 個位元組(Byte)來表示所有符號
- 中文:符號總數量> 256 → 使用 2 個位元組來表示資料
- 符號數量與位元樣式的長度
符號數量 位元樣式長度
2 1
4 2
8 3
16 4
128 7
256 8
65,536 16
4,294,967,296 32

- 文字編碼
* 美國資訊交換標準碼(American Standard Code for Information

3-20
Interchange, ASCII, 參考附錄 A)
# 美國國家標準局(American National Standards Institute, ANSI)制訂
# 7 位元(可表示 128 個符號:000 0000 ~ 111 1111),有 31 個控制字元
# 0~9 編在字母之前,大寫字母(A…Z) 編在小寫字母 (a…z)之前
# 已成為萬國碼的一部分(前 128 個字元)
* 延伸 ASCII (Extended ASCII)
# 8 位元 → 原始 ASCII 編碼左邊加上 0 (0000 0000 ~ 0111 1111)
# 加入新的字元(1000 0000 ~ 1111 1111)
* EBCDIC: Extended Binary Coded Decimal Interchange Code
# IBM 研發,僅在 IBM 所製造的電腦裡使用
# 8 位元(可表示 256 個符號:0000 0000 ~ 1111 1111)
* 萬國碼(Unicode)
# 由硬體及軟體製造商所組成的聯盟所研發
# UTF-8:變動長度,原 ASSCII 編碼之符號使用 1 個位元組(Byte),其
3-21
餘符號使用 1 至 4 個位元組
# UTF-16:變動長度,使用 1 至 2 個 16 位元的編碼單元
# UTF-32:固定長度(32 位元)
# 不同的區段的編碼分配給不同的語言
* 國際標準組織(International Organization for Standardization, ISO)
# 32 位元

(e) 儲存音訊 (Storing audio)


- 取樣(Sampling)
* 將聲音或音樂的類比訊號(Analog signal)轉為數位資料
* 取樣頻率(Sampling rate, S):每秒取多少樣本
* S ≈ 40,000/sec

3-22

最大值
0
1
最小值
一秒內無限多個值


最大值
0
1
最小值
一秒內十個樣本

- 量化(Quantization):將原始實數資料作四捨五入轉為整數
* 音訊樣本以無號整數表示較有效率,故需轉為整數
- 每個樣本的位元數(或稱位元深度,Bit depth, B)
* 早期:8 位元,目前:16、24、32 位元

3-23
- 位元率(Bit rate, R)
* 每秒鐘樣本數(S) × 樣本位元深度(B)
* 例如:S = 40,000 samples/sec, B = 16 bits → R = 40,000×16 =
640,000 bits/sec = 640 Kb/sec
* 例如 MP3:S = 44,100 samples/sec, B = 16 bits, R = 705,600 bits/sec

(f) 儲存圖像
- 位元圖(Bitmap graphic,或稱點掃圖 Raster graphics)
* 影像:像素(Picture element, pixel)的陣列
* 二元影像(Binary image):一個像素以 1 個位元表示(0:黑,1:白)
* 灰階影像(Grayscale image): 一個像素以 8 個位元表示 (0:
黑,255:白,1~254:由黑到白不同深度的灰色)
* 彩色影像:各種色彩模式

3-24
# 例如:RGB (red, green, blue:紅、綠、藍)格式
- 每個像素的色彩以紅、綠、藍三原色所含成份來表示,例如:

色彩 紅 綠 藍 色彩 紅 綠 藍
黑 0 0 0 黃 255 255 0

紅 255 0 0 深藍 0 255 255

綠 0 255 0 紫 255 0 255

藍 0 0 255 白 255 255 255

# 色彩深度(Color depth):一個像素所使用的位元數,例如:紅、綠、藍
各 8 位元 → 共 24 位元(全彩,True color)
# 索引色彩(Indexed color):每個影像僅儲存 256 種色彩(8 位元)
- 對色彩建立索引表(色盤,Palette),像素值則為索引值
- 例如,7×7 影像之色盤及像素:

3-25
索引 色彩(以 RGB 表示) 2 120 35 35 35 35 36
0 (100, 0, 222) 110 58 76 58 76 58 76
1 (114, 25, 150) 200 2 4 5 6 9 12
2 (128, 36, 75) 224 25 9 16 70 51 126
. .
. . 0 88 88 74 65 5 4
. .
255 (46, 253, 77) 99 43 12 59 200 225 197
168 45 85 233 55 254 66

- 全彩與索引色比較:300 萬畫素之彩色影像
* 全彩:3,000,000 × 24 = 72,000,000 位元
* 索引色(色盤+像素):256 × 24 + 3,000,000 × 8 = 24,006,144 位元
- 向量圖(Vector graphic)
* 影像:利用數學公式表示幾何圖形,例如線條、曲線、多邊形...
* 縮放影像不會造成鋸齒、顆粒現象

3-26

You might also like