字符編碼--第2章 數的存儲

第2章 數的存儲函數

 

第1節 機器數測試

計算機中,表示數和數的符號的二進制數,叫作機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數爲0, 負數爲1。編碼

好比,十進制中的數 +3 ,計算機字長爲8位,轉換成二進制就是00000011。若是是 -3 ,就是 10000011 。那麼,這裏的 00000011 和 10000011 就是機器數。spa

機器數可用不一樣的碼制來表示,經常使用的有原碼、補碼和反碼錶示法。.net

 

第2節 真值設計

由於第一位是符號位,因此機器數的形式值就不等於真正的數值。例如上面的有符號數 10000011,其最高位1表明負,其真正數值是 -3 而不是形式值131(10000011轉換成十進制等於131)。因此,爲區別起見,將帶符號位的機器數對應的真正數值稱爲機器數的真值。code

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1blog

 

第3節 有符號數處理ci

在計算機運算中,有符號數的表示須要將負數編碼爲二進制形式。在數學中,任意基數的負數都在最前面加上「−」符號來表示。然而在計算機硬件中,數字都以無符號的二進制形式表示,所以須要一種編碼負號的方法。當前有四種方法,用於擴展二進制數字系統,來表示有符號數:原碼(sign-and-magnitude),反碼(ones' complement),補碼(two's complement),以及移碼excess-N。開發

 

1.原碼

原碼就是符號位加上真值的絕對值,符號及值(sign & magnitude)的處理法是分配一個符號位(sign bit)來表示這個符號:設置這個位(一般爲最高有效位)爲0表示一個正數,爲1表示一個負數。數字中的其它位指示數值(或者絕對值)。所以一個字節只有7位(除去符號位),數值的範圍從0000000(0)到1111111(127)。這樣當你增長一個符號位(第八位)後,能夠表示從−12710到+12710的數字。這種表示法致使的結果就是能夠有兩種方式表示零,00000000(0)與10000000(−0),這大大增長數碼電路的複雜性和設計難度。CPU亦須執行兩次比較,來測試運算結果是否爲零。

十進制數−43用原碼方法編碼成八位的結果爲10101011。

這種方法被直接比較於經常使用的符號表示法(放置一個「+」或者「−」在數字的數值以前)。一些早期的二進制電腦(例如IBM 7090)使用這種表示法,也許是因爲它與通用用途的天然聯繫。原碼是最經常使用的表示浮點數的方法。IEEE二進位浮點數算術標準(IEEE 754)採用最高有效位做爲符號位,所以可表示正負零及正負無限。

 

2.反碼

另外一方面,一種叫作反碼的系統也能夠用於表示負數(注:正數與原碼形式同樣,無需取反)。一個負數的二進制數反碼形式爲其絕對值部分按位取反(即符號位不變,其他各位按位取反)。同原碼錶示同樣,0的反碼錶示形式也有兩種:00000000(+0)與11111111(−0)。

舉例來講,原碼10101011(-43)的反碼形式爲11010100(−43)。有符號數用反碼錶示的範圍爲−(2N−1−1)到(2N−1−1),以及+/−0。傳統的表示爲−12710到+12710,以及00000000(+0)或者11111111(−0)。

正數的反碼是其自己, 負數的反碼是在其原碼的基礎上, 符號位不變,其他各個位取反。注意負數的反碼只需按位求數值的補就能夠獲得,符號不須要變更。

 

3.補碼

補碼(2's complement)是一種用二進制表示有號數的方法,也是一種將數字的正負號變號的方式,常在計算機科學中使用。在臺灣和香港稱爲二補數。數據在計算機中主要是以補碼的形式存儲的。

一個數字的補碼就是將該數字做比特反相運算(即一補數或反碼),再將結果加 1。在補碼系統中,一個負數就是用其對應正數的補碼來表示。正數的補碼就是其自己,負數的補碼是在其原碼的基礎上, 符號位不變, 其他各位取反, 最後+1. (即在反碼的基礎上+1) 。

補碼迴避了0有多種表示的問題以及循環進位的須要。在補碼錶示中,負數以位模式表示爲正值的反碼加1(看成無符號數)。

在補碼錶示中,只有一個0(00000000)。求一個數的否(不管是負數仍是正數)須要反轉全部位,而後加1。一對補碼整數相加等價於一對無符號數相加(除了溢出檢測,若是可以作到的話)。好比,從旁邊的表格能夠看出,127與−128的補碼錶示相加就與無符號數127及128相加具備相同的結果。

補碼系統的最大優勢是能夠在加法或減法處理中,不需由於數字的正負而使用不一樣的計算方式。只要一種加法電路就能夠處理各類有號數加法,並且減法能夠用一個數加上另外一個數的補碼來表示,所以只要有加法電路及補碼電路便可完成各類有號數加法及減法,在電路設計上至關方便。

另外,補碼系統的 0 只有一個表示方式,這點和一補數系統不一樣(在一補數系統中,0 有二種表示方式),所以在判斷數字是否爲 0 時,只要比較一次便可。

8-bit補碼系統的整數。它的可表示的範圍包括-128到127,總共256 (28)個整數。

如下用 4 比特的補碼數字來講明補碼系統的數字表示方式。

在表示正數和零時,二補數數字和通常二進制同樣,惟一的不一樣是在補碼系統中,正數的最高比特恆爲 0,所以4 比特的補碼正數,最大數字爲 0111 (7)。

補碼數字的負數,最高比特恆爲 1,4 比特補碼的數字中,最接近 0 的負數爲 1111 (-1),以此類推,所以絕對值最大的負數是 1000 (-8)。

在通常 n 比特的二進制數字中,最高有效比特(MSB) 第 n 比特表明的數字爲 2n−1。不過,在 n 比特的補碼系統中,最高有效比特(MSB) 第 n 比特表示符號比特,若符號比特爲 0,數字爲正數或 0,若符號比特爲 1,數字爲負數。

求負數補碼錶示的方法:

  (1)寫出與該負數相對應的正數的補碼

  (2)按位求反

  (3)末位加一

  例:假設機器字長爲8位,求-46的補碼。

    + 46的補碼錶示爲: 0010 1110

    按位求反:     1101 0001

    末位加一      1101 0010

    因此,[-46]補碼 = D2H

 

符號擴展:是指一個數從位數較少擴展到位數較多,如從8位擴展到16位,或從16位擴展到32位。

 

  對於用補碼錶示的數,正數的符號擴展在前面補0,負數的符號擴展在前面補1,假設機器字長爲16位,[+46]補碼 = 002EH,[-46]補碼 = FFD2H。

 

n位補碼的表數範圍

 

  8位二進制數能夠表示=256個數,16位二進制數能夠表示=65536個數,當它們是補碼錶示的帶符號數時,8位二進制的表數範圍是 -128 N +127,

16位二進制的表數範圍是 -32768  N  +32767。

  n位補碼的表數範圍是:

 

4.移碼

移碼,是將二進制原碼無符號整數所表明的值,減去一個預設值。

標準移碼,預設值爲二進制原碼錶示的最大整數的一半。 一個數的標準移碼和補碼,最高位相反,其他各位均相同。

 

#include <stdio.h>

 

int main(int argc, char * argv) {

        char a;

        short b;

        a = 127;

        b = (short)127;

        printf("a=%08X,b=%d.\n", a, b);

        a = 128;

        b = (short)128;

    printf("a=%08X,b=%d.\n", a, b);

        a = 1;

        b = (short)1;

        printf("a=%08X,b=%d.\n", a, b);

        a = 0;

        b = (short)0;

        printf("a=%08X,b=%d.\n", a, b);

        a = -0;

        b = (short)-0;

        printf("a=%08X,b=%d.\n", a, b);

        a = -1;

        b = (short)-1;

        printf("a=%08X,b=%d.\n", a, b);

        a = -128;

        b = (short)-128;

        printf("a=%08X,b=%d.\n", a, b);

        a = (char) -129;

        b = (short)-129;

        printf("a=%08X,b=%d.\n", a, b);

    return 0;

}

 

a=0000007F,b=127.

a=FFFFFF80,b=128.

a=00000001,b=1.

a=00000000,b=0.

a=00000000,b=0.

a=FFFFFFFF,b=-1.

a=FFFFFF80,b=-128.

a=0000007F,b=-129.

 

補碼的加、減法

 

  對一個二進制數按位求反、末位加一的運算稱爲求補運算,補碼錶示的數具備如下特徵:

 

  補碼的加法規則是:[X+Y]補=[X] 補+[Y] 補

  補碼的減法規則是:[X-Y] 補=[X] 補+[-Y] 補

 

  其中經過對求補就能夠獲得。

 

  在機器裏,補碼減法是經過對減數求補後把減法轉換爲加法進行的。符號位參加運算,能自動獲得正確結果。

  例:假設機器字長爲8位,計算25+(-32)

    25的補碼是0001 1001,-32的補碼是1110 0000,

  結果剛好是-7的補碼1111 1001,能夠看出運算是正確的。

 

  例:仍假定機器字長爲8位,計算32-(-25)

    爲把減法轉換爲加法,要對-25求補,實際上就是25的補碼0001 1001, 32的補碼是0010 0000,

  結果剛好是57的補碼0101 0111,運算正確。

 

  在某些狀況下,要處理的數全是正數(好比表示地址的數),就沒有必要保留符號位了,能夠把最高有效位也做爲數值處理,這樣的數稱爲無符號數。n位無符號數的表數範圍是。

 

 

第4節 BCD碼

二進碼十進數(英語:Binary-Coded Decimal,簡稱BCD,臺灣稱二進碼十進數)是一種十進制的數字編碼形式。這種編碼下的每一個十進制數字用一串單獨的二進制位元來儲存表示。常見的有4位元表示1個十進制數字,稱爲壓縮的BCD碼(compressed or packed);或者8位元表示1個十進制數字,稱爲未壓縮的BCD碼(uncompressed or zoned)。

這種編碼技術,最經常使用於會計系統的設計裏,由於會計制度常常須要對很長的數字串做準確的計算。相對於通常的浮點式記數法,採用BCD碼,既可保存數值的精確度,又可免卻使電腦做浮點運算時所耗費的時間。此外,對於其餘須要高精確度的計算,BCD編碼亦很經常使用。

BCD碼的主要優勢是在機器格式與人可讀的格式之間轉換容易,以及十進制數值的高精度表示。BCD碼的主要缺點是增長了實現算術運算的電路的複雜度,以及存儲效率低。

 

經常使用BCD編碼方式

最經常使用的BCD編碼,就是使用"0"至"9"這十個數值的二進碼來表示。這種編碼方式,稱爲8421BCD, 除此之外,對應不一樣需求,各人亦開發了不一樣的編碼方法,以適應不一樣的需求。這些編碼,大體能夠分紅有權碼和無權碼兩種:

1.有權碼,如:8421(最經常使用)、242一、5421…

2.無權碼,如:餘3碼、格雷碼…

 

 

1.8421BCD編碼

  這是一種使用最廣的BCD碼,是一種有權碼,其各位的權分別是(從最有效高位開始到最低有效位)八、四、二、1(即2三、2二、2一、20),於是稱爲「8421BCD編碼」。

好比:8421BCD碼的1011=8*1+4*0+2*1+1*1=11

在使用8421BCD碼時必定要注意其有效的編碼僅十個,即:0000~1001。4位二進制數的其他6個編碼10十、10十一、1100、110一、11十、1111不是有效編碼。這種BCD編碼實際上就是0~9的「等值」二進制數。

 

2.2421BCD編碼

  2421BCD碼也是一種有權碼,其從高位到低位的權分別爲二、四、二、1(一樣也是它得名的緣由),其也能夠用4位二進制數來表示1位十進制數。

好比: 2421BCD碼的(1100 0100 0010)=十進制的(6 4 2)

由於

2421BCD碼的1100=2*1+4*1+2*0+1*0=6

2421BCD碼的0100=2*0+4*1+2*0+1*0=4

2421BCD碼的0010=2*0+4*0+2*1+1*0=2

 

3.餘3碼

  餘3碼也是一種BCD碼,但它是無權碼。但因爲每個碼對應的8421BCD碼之間相差3,故稱爲餘3碼,其通常使用較少,故只須做通常性瞭解。

餘三碼是在8421BCD碼的基礎上,把每一個數的代碼加上0011(對應十進制數3)後獲得的。

 

4.格雷碼

格雷碼(循環二進制單位距離碼)是任意兩個相鄰數的代碼只有一位二進制數不一樣的編碼,它與奇偶校驗碼同屬可靠性編碼。

格雷碼(Gray code)是由貝爾實驗室的Frank Gray在1940年提出,用於在PCM(脈衝編碼調變)方法傳送訊號時防止出錯,並於1953年3月17日取得美國專利。格雷碼是一個數列集合,相鄰兩數間只有一個位元改變,爲無權數碼,且格雷碼的順序不是惟一的。

格雷碼能避免訊號傳送錯誤的原理

傳統的二進位系統例如數字3的表示法爲011,要切換爲鄰近的數字4,也就是100時,裝置中的三個位元都得要轉換,所以於未徹底轉換的過程時裝置會經歷短暫的,010,001,101,110,111等其中數種狀態,也就是表明着二、一、五、六、7,所以此種數字編碼方法於鄰近數字轉換時有比較大的偏差可能範圍。葛雷碼的發明便是用來將偏差之可能性縮減至最小,編碼的方式定義爲每一個鄰近數字都只相差一個位元,所以也稱爲最小差別碼,可使裝置作數字步進時只更動最少的位元數以提升穩定性。 數字0~7的編碼比較以下:

十進位 葛雷碼 二進位

0     000    000

1     001    001

2     011    010

3     010    011

4     110    100

5     111    101

6     101    110

7     100    111

直接排列

以二進制爲0值的格雷碼爲第0項,第1項改變最右邊的位元,第2項改變右起第一個爲1的位元的左邊位元,第三、4項方法同第一、2項,如此反覆,便可排列出n個位元的格雷碼。

格雷碼轉二進位數

二進位碼第n位 = 二進位碼第(n+1)位+格雷碼第n位。由於二進位碼和格雷碼皆有相同位數,因此二進位碼可從最高位的左邊位元取0,以進行計算。(注:遇到1+1時結果視爲0)

例如: 格雷碼0111,爲4位數,因此其所轉爲之二進位碼也必爲4位數,所以可取轉成之二進位碼第五位爲0,即0 b3 b2 b1 b0。

0+0=0,因此b3=0

 0+1=1,因此b2=1

 1+1=10取0,因此b1=0

 0+1=1,因此b0=1

所以所轉換爲之二進位碼爲0101

 

應用

格雷氏編碼與相位移在三維曲面量測:利用格雷碼投射在微型曲面作量測 一個非接觸式、投影的方法光學測量。在化簡邏輯函數時,能夠經過按格雷碼排列的卡諾圖來完成。

和葛雷碼有相同數學模式的玩具

中國的古老益智玩具九連環有着和格雷碼徹底相同的數學模式,外國一款名爲spin out的玩具也是運用相同的數學模式。

 

字符編碼--第3章 字符的存儲--ASCII

相關文章
相關標籤/搜索