五、計算機數據表示
1.二進制計數制
引入二進制數字系統的計算機結構和性能具有如下的優點:
(1)技術實現容易。
(2)二進制運算規則簡單。
(3)計算機中二進制數的0、1數碼與邏輯代數變量值0與1吻合,所以二進制同時可以使計算機方便地進行邏輯運算。
(4)二進制數和十進制數之間的關系亦不復雜。
2.任意進制計數制和十進制計數制的相互轉換
十進制數轉換成二進制數:
十進制數據轉換為二進制數時,因整數部分與小數部分轉換算法不同,需要分別進行。
(1)整數轉換方法———除基取余法
十進制整數除以2取余數作最低位系數k 0 ,再取商的繼續除以2取余數作高一位的系數,如此繼續直到商為0時停止,最后一次的余數就是整數部分最高有效位的二進制系數,依次所得到的余數序列就是轉換成的二進制數。因為除數2是二進制的基數,所以這種算法稱作“除基取余”法。
(2)小數轉換方法———乘基取整法
把十進制小數乘以2,取其積的整數部分作為對應二進制小數的最高位系數k -1 ,再取積的純小數部分乘以2,新得積的整數部分又作下一位的系數k -2 ,再取其積的純小數部分繼續乘2,…,直到乘積小數部分為0時停止,這時乘積的整數部分是二進制數最低位系數,每次乘積得到的整數序列就是所求的二進制小數,這種方法每次乘以基數取其整數作系數。所以叫乘基取整法。需要指出的是并不是所有十進制小數都能轉換成有限位的二進制小數并出現乘積的小數部分0的情況,有時整個換算過程會無限進行下去,此時可以根據要求并考慮計算機字長,取一定長度的位數后四舍五入,這時得到的二進制數是原十進制數的近似值。
一個既有整數部分又有小數的數送入計算機后,由機器把整數部分按“除基取余”法,小數部分按“乘基取整”法分別進行轉換,然后合并。任意進制數轉換成十進制數:
任意一種進位計數制的數轉換成十進制數的方法都是一樣的。把任意進制數按權展開成多項式和的形式,把各位的權與該位上的數碼相乘,乘積逐項相加,其和便是相應的十進制數。十進制數轉換成任意進制數:
十進制數轉換成任意進制數與十進制數轉換成二進制數的方法完全相同,即整數部分用除基取余的算法,小數部分用乘基取整的方法,然后將整數與小數拼接成一個數作為轉換的最后結果。
3.數的機器碼表示
符號數的機器碼表示:
(1)機器數和真值
數在計算機中的表示形式統稱為機器數。機器數有兩個基本特點,其一,數的符號數值化。實用的數據有正數和負數,因為計算機只能表示0、1兩種狀態,數據的正號“+”或負號“-”,在機器里就用一位二進制的0或1來區別。通常這個符號放在二進制數的最高位,稱符號位,以0代表符號“+”,以1代表符號“-”,這樣正負符號就被數值化了。因為有符號占據一位,數的形式值就不等于真正的數值,帶符號位的機器數對應的數值稱為機器數的真值。
機器數的另一個特點是二進制的位數受機器設備的限制。機器內部設備一次能表示的二進制位數叫機器的字長,一臺機器的字長是固定的。字長8位叫一個字節(Byte),現在機器字長一般都是字節的整數倍,如字長8位、16位、32位、64位。
符號位數值化之后,為能方便的對機器數進行算術運算、提高運算速度,計算機設計了多種符號位與數值一起編碼的方法,最常用的機器數表示方法有三種:原碼、反碼和補碼。
(2)原碼表示法和反碼表示法
一個機器數X由符號位和有效數值兩部分組成。設符號位為X 0 ,X真值的絕對值|X|=X 1 X 2 …X n ,X的機器數原碼表示為:
[X]原 =X0X1X2…Xn
當 X≥0時,X0 =0
當 X<0時,X0 =1
原碼表示很直觀,但原碼加減運算時符號位不能視同數值一樣參加運算,運算規則復雜,運算時間長,而計算機大量的數據處理工作是加減運算,原碼表示就很不方便了。
一個負數的原碼符號位不動,其余各位取相反碼就是機器數的另一種表示形式———反碼表示法。正數的反碼與原碼相同。
設[X]原 =X0X1X2…Xn
當 X0 =0時,[X]反 =X0X1X2…Xn
當 X0 =1時,[X]反 =X0X1X2…Xn
(3)補碼表示法(complement)
設計補碼表示法的目的是:①使符號位能和有效數值部分一起參加數值運算從而簡化運算規則,節省運算時間。②使減法運算轉化成加法運算,從而進一步簡化計算機中運算器的線路設計。計算機是一種有限字長的數字系統,因此都是有模運算,超過模的運算結果都將溢出。n位二進制整數的模是2 n 。
對于二進制數還有一種更加簡單的方法由原碼求得補碼。①正數的補碼表示與原碼一樣,[X] 補 =[X] 原
②負數的補碼是將原碼符號位保持“1”之后其余各位取相反的碼,末位加1便得到補碼,即取其原碼的反碼再加1∶[X] 補 =[X] 反 +1。
真值+0和-0的補碼表示是一致的,但在原碼和反碼表示中具有不同的形式。8位補碼機器數可以表示-128,但不存在+128的補碼,由此可知8位二進制補碼能表示數的范圍是-128~+127。應該注意,不存在-128的8位原碼和反碼形式。
根據互補的概念,一個補碼機器數再求一次補就得到機器數的原碼了。定點數與浮點數:
(1)定點數(fixed-point number)
計算機處理的數據不僅有符號,而且大量的數帶有小數,小數點不占有二進制位而是隱含有機器數里某固定位置上。通常采用兩種簡單的約定:一種是約定所有機器數的小數點位置隱含在機器數的最低位之后,叫定點純整數機器數,簡稱定點整數。
另一種約定是所有機器數的小數點位置隱含在符號位之后、有效數值部分最高位之前,叫定點純小數機器數,簡稱定點小數。
計算機采用定點數表示時,對于既有整數又有小數的原始數據,需要設定一個比例因子,數據按比例因子縮小成定點小數或擴大成定點整數再參加運算,結果輸出時再按比例折算成實際值。n位原碼定點整數的表示范圍是-(2 n-1 -1)≤X≤2 n-1 -1,n位原碼定點小數的表示范圍是-(1-2 -(n-1) )≤X≤1-2 -(n-1) 。當機器數小于定點數的最小值時,被當作0處理,超出定點數的最大值時,機器無法表達,稱作“溢出”,此時機器將停止運算,屏幕顯示溢出警告。
定點數表示方法簡單直觀,不過定點數表示數的范圍小,不易選擇合適的比例因子,運算過程容易產生溢出。
(2)浮點數(floating-point number)
計算機采用浮點數來表示數值,它與科學計算法相似,把任意一個二進制數通過移動小數點位置表示成階碼和尾數兩部分:N=2 E ×S
其中:E———N的階碼(exponent),是有符號的整數;
S———N的尾數(mantissa),是數值的有效數字部分,一般規定取二進制定點純小數形式。
浮點數運算必須化成規格化形式。所謂規格化,對于原碼尾數應使最高數字位S 1 =1,如果不是1,且尾數不是全為0時就要移動尾數直到S 1 =1,階碼相應變化,保證N值不變。如果尾數是補碼,當N是正數時,S 1 必須是1,而N是負數時,S 1 必須是0,才稱為規格化的形式。
4.數字編碼
十進制數在機內轉換成二進制數時,有時也以一種中間數字編碼形式存在,它把每一位十進制數用四位二進制編碼表達,每一組只表達0~9的數值運算時,有專門的電路在每四位二進制間按“十”進位處理,故稱為二進制編碼的十進制數———BCD碼(Binary Coded Decimal)或稱二—十進制數。其編碼種類很多,如格雷碼、余3碼等,最常用的叫8421BCD碼,4個二進制位自左向右每位的權分別是8、4、2、1。0~9的8421碼與通常的二進制一樣進位,十分簡單,當計數超過9時,需要采取辦法自動向十進制高位進一,即要進行“十進制調整”才能得到正確結果。
5.校驗碼
由于器件質量不可靠、線路工藝不過關、遠距離傳送帶來的干擾或受來自電源、空間磁場影響等因素,使得信息在存取、傳送和計算過程中難免會發生諸如“1”誤變為“0”的錯誤,計算機一旦出錯,要能及時檢測并糾正錯誤,其中一種方法是對數據信息擴充,加入新的代碼,它與原數據信息一起按某種規律編碼后具有發現錯誤的能力,有的甚至能指出錯誤所在的準確位置使機器自動糾正,能起這種作用的編碼叫“校驗碼”(check code)。
奇偶校驗碼:
將每個數據代碼擴展一個二進位作校驗位(parity bit),這個校驗取0還是取1的原則是:若是奇校驗(odd parity),編碼是含“1”的個數連同校驗位的取值在內共有奇數個“1”;若是偶校驗(even parity),連同校驗位在內編碼里含“1”的個數是偶數個。
交*校驗:
計算機進行大量字節傳送時一次傳送幾百甚至更多字節組成的數據塊,如果不僅每一個字節有一個奇偶校驗位———稱橫向校驗,而且全部字節的同一位也設置了一個奇偶校驗位———稱縱向校驗,對數據塊代碼的橫向縱向同時校驗,這種情況叫交*校驗。循環冗余校驗碼———CRC碼(Cyclic Redundancy Check):
計算機信息傳向遠方終端或傳到另一個計算中心時,信息沿一條通信線路一位位傳送,這種通信方式叫串行通信。循環冗余碼(簡稱CRC碼)就是一種檢驗能力很強,在串行通信中廣泛采用的校驗編碼。
(1)CRC碼
串行傳送的信息M(X)是一串k位二進制序列,在它被發送的同時,被一個事先選擇的“生成多項式”相除,“生成多項式”長r+1位,相除后得到r位余數就是校驗位,它拼接到原k位有效信息后面即形成CRC碼。CRC碼到達接收方時,接收方的設備一方面接收CRC碼,一方面用同樣的生成多項式相除,如果正好除盡,表示無信息差錯,接收方去掉CRC碼后面r位校驗位,收下k位有效信息;當不能除盡時,說明有信息的狀態位發生了轉變,即出錯了。一般要求重新傳送一次或立即糾錯。
(2)CRC碼計算
傳送信息時生成CRC碼以及接收時對CRC碼校驗都要與“生成多項式”相除,這里除法是“模2運算”,即二進位運算時不考慮進位和借位。作模2除法時,取商的原則是當部分余數首位為1時商取1,反之商取0,然后按模2減,求部分余數。這個余數不計高位。當被除數逐位除完時,最后余數的位數比除數少一位。該余數就是校驗位。它拼接在有效信息后面組成CRC碼。因為校驗位擴充了傳送部分的代碼,所以這是一種基于“冗余校驗”的思想的校驗辦法。
(3)生成多項式
CRC碼是M(X)除以某一個預先選定的多項式后產生的,所以這個多項式叫生成多項式。并不是任何一個r+1位的編碼都可以作生成多項式用,它應能滿足當任何一位發生傳送錯誤時都能使余數不為0,并且不同位發生錯誤時應當使余數也不同,這樣不但能檢錯而且能推斷是哪一位出錯,從而有利于準確的糾錯。有兩個生成多項式,其檢錯率很高。
X16+X15+X2+1
X16+X12+X6+1