2.4 浮點數的編碼表示
1. 浮點數類型
C語言聲明 | 操作數類型 | 存儲長度(位) |
---|---|---|
float | 單精度浮點數 | 32 |
double | 雙精度浮點數 | 64 |
long double | 擴展精度浮點數 | 80 / 96 |
2. 浮點數的表示
(1)浮點數(Floating Point)的表示範圍
- 以下面的32位浮點數格式的規格化數爲例,計算表示範圍
①第0位數符S;
②第1~8位爲8位移碼錶示階碼E(偏置常數爲128);
③第9 ~31位爲24位二進制原碼小數表示的尾數M;
規格化尾數的小數點後第一位總是1,故規定第一位默認的“1”不明顯表示出來。這樣可用23個 數位表示24位尾數。
- 因爲原碼對稱,故其表示範圍關於原點對稱。可表示的範圍包括圖中陰影部分和零
- 機器0:即尾數爲0 或落在下溢區中的數
- 浮點數範圍比定點數大,但數的個數沒變多,故數之間更稀疏,且不均勻
(2)規格化數形式(Normal format)
爲了能表示更多有效數字,通常規定規格化數的小數點前爲1
- 32-bit 規格化數
其中:
①S是符號位(Sign)
②Exponent用移碼(增碼)來表示
③Significand 表示xxxxxxxxxxxxx(部分尾數) (基可以是2/ 4 / 8 / 16,約定信息,無需顯式表示)
(3) IEEE 754 標準
- 單精度浮點數表示:
其中:
①Sign bit: 1 表示negative ; 0表示positive
②Exponent(階碼):全0或全1用來表示特殊值
SP規格化階碼範圍爲0000 0001 (-126) ~ 1111 1110 (127)
偏置常數(bias)爲127 (single), 1023 (double)
③Significand(部分尾數):
規格化尾數最高位總是1,所以隱含表示,省1位
1 + 23 bits (single),1 + 52 bits (double)
==》單精度浮點(SP): (-1)Sx (1 + Significand) x 2(Exponent-127)
雙精度浮點(DP): (-1)Sx (1 + Significand) x 2(Exponent-1023)
Q:爲什麼偏置常數要取127而不是128?
A: IEEE 754標準中,單精度浮點數可表示的範圍是0000 0001 (-126) ~ 1111 1110 (127);若偏置常數使用128,則32位浮點數可表示的範圍0000 0001 (-127) ~ 1111 1110 (126),[128-127=1,128+126=2^7 -1] , 而 2^126 ~2^127可表示的範圍比 2^-127 ~ 2^-127 大。
Q: 已知float型變量x的機器數爲BEE00000H,求x的值是多少?
A: 轉化爲二進制 :1 ,011 11101,110 0000 0000 0000 0000 0000
- 數符: 1 (負數)
- 階(指數):
爲避免混淆,用"階碼"表示階的編碼,用"階"或"指數"表示階碼的值
階碼: 0111 1101B = 125
階碼的值: 125 -127 = -2- 尾數數值部分: 1 +1x2-1+ 1x2-2+ 0x2-3+ 0x2-4+ 0x2-5+… =1+2-1+2-2= 1+0.5 +0.25 = 1.75
所以,真值: -1.75x2-2= -0.4375
Q: 已知float型變量x的值爲-12.75,求x的機器數是多少?
A: -12.75=-1100.11B =-1.10011B x 23
- 符號S=1
- 階碼E=127+3=128+2=1000 0010
- 顯式表示的部分尾數Significant = 100 1100 0000 0000 0000 0000
所以: x 的機器數表示爲: 1 ,1000 0010, 100 1100 0000 0000 0000 0000
轉換爲十六進制表示爲:C14C0000H
3. 其他形式的機器數表示
前面的定義是針對規格化形式(normalized form)的數 那麼,其他形式的機器數表示什麼樣的信息呢?
(1)0的機器數表示
- How to represent 0?
- exponent: all zeros
- significand: all zeros
- What about sign?Both cases valid.
+0: 0 00000000 00000000000000000000000
-0: 1 00000000 00000000000000000000000
(2)+∞/-∞的機器數表示
- 浮點數除0的結果是+/-∞, 而不是溢出異常.(整數除0爲異常)
- 爲什麼要這樣處理? 可以利用+∞/-∞作比較。例如:X/0>Y可作爲有效比較
- How to represent +∞/-∞?
- Exponent: all ones (11111111B = 255)
- Significand: all zeros
+∞: 0 11111111 00000000000000000000000
-∞: 1 11111111 00000000000000000000000
(3)“非數”的表示(NaN)
- 例如“Sqrt (-4.0) ”,“0/0”等的結果稱爲Not a Number (NaN) ,即“非數”
- NaNs 可以幫助調試程序
- How to represent NaN ?
- Exponent: 255
- Significand: nonzero
4. 非規格化數(Denorms)的表示
- How to represent Denorms?
- Exponent: 0
- Significand: nonzero
關於浮點數精度的一個例子
61.419998和61.420002是兩個可表示數,兩者之間相差 0.000004。當輸入數據是一 個不可表示數時,機器將其轉換爲最鄰近的可表示數。
5. 總結
Exponent | Significand | 表示類型 |
---|---|---|
0 | 0 | +/-0 |
0 | nonzero | Denorms |
1-254 | 任意,小數點前隱含1 | Norms |
255 | 0 | +/-infinity |
255 | nonzero | NaN |
2.5 非數值數據的編碼表示
1. 邏輯數據的編碼表示
- 何時會用到邏輯數據:表示邏輯(關係)表達式中的邏輯值(真/假 )
- 表示: 用一位表示。N位二進制數(位串)可表示N個邏輯數據
- 運算: 按位進行。如,按位與/ 按位或/ 邏輯左移/ 邏輯右移等
- 識別: 邏輯數據和數值數據在形式上並無差別,也是一串0/1序列, 計算機靠指令來識別。
2. 西文字符的編碼表示
- 特點
是一種拼音文字,用有限幾個字母可拼寫出所有單詞
只需對有限個字母和數學符號、標點符號等輔助字符編碼
所有字符總數不超過256個,使用7或8個二進位可表示 - 表示(常用編碼爲7位ASCII碼)
十進制數字:0/1/2…/9
英文字母:A/B/…/Z/a/b/…/z –專用符號:+/-/%/*/&/……
控制字符(不可打印或顯示) - 操作
字符串操作,如:傳送/比較 等 - ASCII碼錶:
0 -- 30H
,A -- 41H
,a -- 61H
3. 漢字及國際字符的編碼表示
(1)漢字的編碼形式
- 輸入碼: 對漢字用相應按鍵進行編碼表示,用於輸入
- 內碼: 用於在系統中進行存儲、查找、傳送等處理
- 字模點陣或輪廓描述: 描述漢字字模點陣或輪廓,用於顯示/打印
Q: 西文字符有沒有輸入碼?有沒有內碼? 有沒有字模點陣或輪廓描述?
A: 西文可由鍵盤直接輸入,不用輸入碼;但也有內碼和字模點陣。
(2)GB2312-80字符集
- 由三部分組成
①字母、數字和各種符號,包括英文、俄文、日文平假名與片假名、羅馬字母、漢語拼音等共687個
②一級常用漢字,共3755個,按漢語拼音排列
③二級常用漢字,共3008個,不太常用,按偏旁部首排列 - 漢字的區位碼
①碼錶由94行、94列組成,行號爲區號,列號爲位號,各佔7位
②指出漢字在碼錶中的位置,共14位,區號在左、位號在右 - 漢字的國標碼
①每個漢字的區號和位號各自加上32(20H),得到其“國標碼”
②國標碼中區號和位號各佔7位。在計算機內部,爲方便處理與存 儲,前面添一個0,構成一個字節。
(3)漢字內碼
- 至少需2個字節才能表示一個漢字內碼。爲什麼?
由漢字的總數(超過6萬字)決定! 2^16=65536 - 可在GB2312國標碼的基礎上產生漢字內碼
爲與ASCII碼區別,將國標碼的兩個字節的第一位 置“1”後
得到一種漢字內碼(可以有不同的編碼方案)
4. 多媒體信息的表示
- 圖形、圖像、音頻、視頻等信息在機器內部也用0和1表示
– 圖形用構建圖形的直線或曲線的座標點及控制點來描述,而這些 座標點或控制點則用數值數據描述
– 圖像用構成圖像的點(像素)的亮度、顏色或灰度等信息來描述 ,這些亮度或顏色等值則用數值數據描述
– 音頻信息通過對模擬聲音進行採樣、量化(用二進制編碼)來獲 得,因此量化後得到的是一個數值數據序列(隨時間變化)
– 視頻信息描述的是隨時間變化的圖像(每一幅圖像稱爲一幀)
– 音樂信息(MIDI)通過對演奏的樂器、樂譜等相關的各類信息用 0和1進行編碼來描述
– ……. - 多媒體信息用一個複雜的數據結構來描述,其中的基本數據或者 是數值數據,或者是用0/1編碼的非數值數據
2.6 數據寬度和存儲容量的單位
1. 數據的基本寬度
- 比特(bit,位)是計算機中處理、存儲、傳輸信息的最小單位
- 二進制信息最基本的計量單位是“字節”(Byte) –現代計算機中,存儲器按字節編址
– 字節是最小可尋址單位 (addressable unit )
– 如果以字節爲一個排列單位,則LSB表示最低有效字節,MSB 表示最高有效字節 - 除比特(位)和字節外,還經常使用“字”(word) 作爲單位 。
“字”和“字長”的概念不同
- “字長”指數據通路的寬度。 ”字長”等於CPU內部總線的寬度、運算器的位數、通用 寄存器的寬度(這些部件的寬度都是一樣的)
- “字”表示被處理信息的單位,用來度量數據類型的寬度
- 字和字長的寬度可以一樣,也可不同
例1:對於x86體系結構,不管字長多少,定義“字”的寬 度都爲16位,而從386開始字長就是32位了。
例2:對於MIPS 32體系結構,其字和字長都是32位。
數據通路指CPU內部數據流經的路徑以及路徑上的部件,主要是 CPU內部進行數據運算、存儲和傳送的部件,這些部件的寬度基 本上要一致,才能相互匹配。
2.數據量的度量單位
- 存儲二進制信息時的度量單位要比字節或字大得多
- 容量經常使用的單位有:
– “千字節”(KB),1KB=210字節=1024B
– “兆字節”(MB),1MB=220字節=1024KB
– “千兆字節”(GB),1GB=230字節=1024MB
– “兆兆字節”(TB),1TB=240字節=1024GB - 通信中的帶寬使用的單位有:
– “千比特/秒”(kb/s),1kbps=103 b/s=1000 bps
– “兆比特/秒”(Mb/s),1Mbps=106 b/s=1000 kbps
– “千兆比特/秒”(Gb/s),1Gbps=109 b/s=1000 Mbps
– “兆兆比特/秒”(Tb/s),1Tbps=1012 b/s=1000 Gbps
如果把b換成B,則表示字節而不是比特(位) 例如,10MBps表示10兆字節/秒
3. 程序中數據類型的寬度
- 高級語言支持多種不同類型和 不同長度的數據
–例如,C語言中char類型的寬 度爲1個字節,可表示一個字 符(非數值數據),也可表示 一個8位的整數(數值數據)
–不同機器上表示的同一種類型 的數據可能寬度不同
- 必須確定相應的機器級數據表示方式和相應的處理指令