3.經常使用數值編碼
因為機器數在計算時,假設符號位和數值位同一時候參與運算,則可能會產生錯誤結果;而假設單獨考慮符號問題,又會添加運算器件的實現難度。因此,為了使計算機可以方便地對數值進行各種算術邏輯運算,必須對數值型數據進行二進制編碼處理。所謂編碼是採用少量的基本符號(如0和1),依照一定的組合原則,來表示大量復雜多樣的信息的技術。編碼的優劣直接影響到計算機處理信息的速度。數值型數據的經常使用編碼方法包含:原碼、反碼、補碼。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
(1)原碼。原碼的編碼規則是:符號位0表示正,1表示負,數值部分用該數絕對值的二進制數表示。當整數時,小數點隱含在最低位之后;當純小數時,小數點隱含在符號位和數值位之間,均不占位。通經常使用[X]原表示數X的原碼。
比如,設機器字長為8位,
[+1]原?=?00000001???????? [+127]原?=?01111111?????? [+0]原?=?00000000
[–?1]原?=?10000001??????? [–?127]原?=?11111111?????? [–?0]原?=?10000000
顯然,按原碼的編碼規則,零有兩種表示形式。
原碼表示法簡明易懂,與其真值的轉換方便,比較easy進行乘除運算。可是在進行加減運算時,原碼運算非常不方便。因為符號位不能和數值一樣參與運算,所以要依據兩數的符號情況,同號相加,異號相減,還要依據兩數的絕對值大小,令大數減去小數,最后還要推斷結果的符號。這樣不僅要求運算器既能作加法,又能作減法,還必須附加很多條件推斷的處理,終于既添加了運算器的實現復雜性,又延長了運算的時間。
(2)反碼。反碼的編碼規則是:符號位0表示正,1表示負,正數的反碼等于原碼,負數的反碼等于原碼除符號位外按位取反,即0變1、1變0。通經常使用[X]反表示數X的反碼。
比如,設機器字長為8位,
[+1]反?=?00000001???????? [+127]反?=?01111111?????? [+0]反?=?00000000?
[– 1]反?=?11111110????????? [– 127]反?=?10000000???? [– 0]反?=?11111111
顯然,按反碼的編碼規則,零也有兩種表示形式。
反碼非常easy由原碼獲得,但相同不方便運算,一般在求補碼的過程中用到反碼。
(3)補碼。補碼的編碼規則是:符號位0表示正,1表示負,正數的補碼等于原碼,負數的補碼等于反碼末位加1。通經常使用[X]補表示數X的補碼。
比如,設機器字長為8位,
[+1]補?=?00000001???????? [+127]補?=?01111111?????? [+0]補?=?00000000
[– 1]補?=?11111111????????? [– 127]補?=?10000001???? [– 0]補?=?00000000
顯然,按補碼的編碼規則,零有惟一的表示形式。
補碼的概念來源于數學上的“模”和補數。比如,將鐘表的時針順時針撥快5小時和逆時針撥慢7小時,最后指示的位置同樣,則稱5和–7互為模12情況下的補數。計算機中機器數受機器字長限制,所以是有限字長的數字系統。對于整數來說,機器字長為n位(含符號位),模是2n;對于有符號純小數來說,模是2。
求補運算通常利用反碼來實現。
【例】 求X?=?+1011,Y?=?–1101的原碼、反碼和補碼。
解??? [X?]原?=?01011??????????????? [Y?]原?=?11101
?????? [X?]反?=?01011??????????????? [Y?]反?=?10010
?????? [X?]補?=?01011??????????????? [Y?]補?=?10011
採用補碼進行加減運算十分方便。通過對負數的編碼處理,同意符號位和數值一起參與運算,能夠把減法運算轉化為加法運算。不論求和求差,也不論操作數為正為負,運算時一律僅僅做加法,從而大大簡化運算器的設計,加快了運算速度。
比如,(–9)+(–5)的運算例如以下:
[–9]補?=?11110111????????????????? 11110111
[–5]補?=?11111011?????????? +???? 11111011
?????????????????????????????????? ?? 111110010
由于機器字長的限制,丟失高位1,運算結果機器數為11110010,是–14的補碼形式。
眼下,因為計算機中最多的運算是加減運算,為了簡化運算器設計,加快運算速度,有些計算機在數值表示、存儲、運算時均採用補碼表示法,也有些計算機,數用原碼進行存儲和傳送,運算時採用補碼,還有些計算機在進行加減法時採用補碼運算,而在進行乘除法時採用原碼運算。
4.精度和溢出
現代數字計算機是有限字長的數字系統,機器數表示的范圍受到機器字長和數據類型的限制,一旦機器字長和數據類型確定了,機器數所能表示的數的范圍和精度也就確定了。所謂精度,是指能夠給出的有效數字的位數。一般來說,機器字長越長,能夠表示的數的范圍越大,精度越高;當字長同樣時,浮點數通常比整數能夠表示的數的范圍要大;浮點數表示時,階碼位數越多,能夠表示的數的范圍越大,尾數位數越多,能夠表示的數的精度越高。
假設一個數的大小超出了計算機所能表示的數的范圍,則產生“溢出”。假設兩個正數相加,結果大于機器所能表示的最大正數,稱為“上溢”;假設兩個負數相加,結果小于機器所能表示的最小負數,稱為“下溢”。比如,字長為n位的有符號整數,最高1位為符號位,數值位為n–1位,用補碼表示時,數的表示范圍為–2n–1~2n–1–1,一旦運算時發生結果超出此范圍的情況,就產生溢出。