熱線電話:0755-23712116
郵箱:contact@shuangyi-tech.com
地址:深圳市寶安區(qū)沙井街道后亭茅洲山工業(yè)園工業(yè)大廈全至科技創(chuàng)新園科創(chuàng)大廈2層2A
在計(jì)算機(jī)中有以下幾個(gè)對(duì)象需要表示:
程序
整數(shù)
浮點(diǎn)數(shù)
字符串
邏輯值:0表示false,1表示true
在計(jì)算機(jī)中所有編碼的基本元素都是通過0、1這兩個(gè)基本符號(hào)來表示,n位可以表示2^n個(gè)不同的對(duì)象
邏輯型數(shù)據(jù)
True 真--1
False 假—0
數(shù)據(jù)運(yùn)算
與運(yùn)算
或運(yùn)算
非運(yùn)算
異或運(yùn)算
在很久之前,一群美國人研究出來了計(jì)算機(jī),其中他們發(fā)現(xiàn)他們只需要8位二進(jìn)制編碼(一個(gè)字節(jié))就可以表示世間萬物(其實(shí)它們只使用了7位),2^7=128,它們用這128位,從0到127來存儲(chǔ)數(shù)字和字母,這個(gè)編碼就是我們熟悉的Ascii碼
但是世界各國都用計(jì)算機(jī),但是不使用中文,比如我們中國就不使用中文,所以這個(gè)時(shí)候中國研究出來了GB2312和GBK。當(dāng)前其它國家也開發(fā)出來了符合本國國情的編碼,那么這此時(shí)出現(xiàn)一個(gè)問題,就是自己國家用著很嗨,但是國與國之間交流的時(shí)候就含麻煩了。
所以為了解決這個(gè)問題,標(biāo)記標(biāo)準(zhǔn)組織ISO著手解決這個(gè)問題,它們統(tǒng)一標(biāo)準(zhǔn),包含所有國家的大多數(shù)的字符,這個(gè)標(biāo)準(zhǔn)編碼就是Unicode,unicode開始制定的時(shí)候計(jì)算機(jī)的存儲(chǔ)容量得到了極大的發(fā)展,所以它直接使用16個(gè)字符來表示一個(gè)字符,那么2^16=65536一共可以表示這么多的字符,它將整個(gè)編碼空間劃分為塊,每塊為16的倍數(shù),然后按塊進(jìn)行分配。同時(shí)它保留了6400個(gè)碼點(diǎn)供本地化使用。但是它仍然存在一個(gè)問題,就是這65536仍然是不夠用啊,因?yàn)槭澜缟嫌刑嗟淖址枰硎玖恕?/p>
隨著計(jì)算機(jī)的發(fā)展,現(xiàn)在已經(jīng)是64位的了, 2^64據(jù)說可以表示地球上的每一粒沙子,所以問題很好解決,只需要通過64位來表示不就行了嗎?
但是此時(shí)還是存在一個(gè)問題,這個(gè)問題就是在之前的時(shí)候ascii使用7個(gè)字節(jié)就可以表示出常用的數(shù)字和字母,那么現(xiàn)在使用64位來表示,豈不是太浪費(fèi)空間了嗎?不過沒有什么可以難倒科學(xué)家的,科學(xué)家提出了UTF-8編碼,這個(gè)是一個(gè)變長(zhǎng)的字符編碼,它可以提高存儲(chǔ)空間的利用率。
首先它通過首字節(jié)來確定整個(gè)字符的長(zhǎng)度,然后除了字符首字節(jié)外,均以“10”開始,這個(gè)編碼太厲害了,能用7位表示的堅(jiān)決不用31位表示,這樣既可以表示大量的字符,又不會(huì)浪費(fèi)太多的空間,所以它能為了互聯(lián)網(wǎng)上占統(tǒng)治地位的字符集。
如圖所示,我們可以看到字節(jié)1中前面的數(shù)字本標(biāo)識(shí)字符的位數(shù),當(dāng)為0時(shí)表示7位,當(dāng)110時(shí)表示11位,然后字節(jié)1之后的所有字節(jié)均通過10開頭,這就是它的格式。
字符型就是常常通過utf-8來進(jìn)行表示,那么現(xiàn)在我們來說說在計(jì)算機(jī)中是怎么存儲(chǔ)數(shù)值型數(shù)據(jù)的,數(shù)值型分為兩種一種是定點(diǎn)數(shù),還有一種是浮點(diǎn)數(shù)。
其中定點(diǎn)數(shù)有三種情況,一種是整數(shù)、另一種是定點(diǎn)小數(shù)、還有一種是小數(shù)點(diǎn)位置固定。
浮點(diǎn)數(shù)有一種就是小數(shù)點(diǎn)位置浮動(dòng)。
下面我們僅僅介紹整數(shù)。要想表示一個(gè)整數(shù),首先需要確定數(shù)制,比如在現(xiàn)實(shí)生活中我們常常使用的數(shù)值是10進(jìn)制,但是在計(jì)算機(jī)中使用的是二進(jìn)制:
我們先來看一下二進(jìn)制和十進(jìn)制之間的轉(zhuǎn)換:
二進(jìn)制轉(zhuǎn)成10進(jìn)制
10進(jìn)制轉(zhuǎn)成2進(jìn)制
把十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制,對(duì)整數(shù)部分通過除2取余數(shù)來完成,對(duì)小數(shù)部分通過乘以2取整數(shù)來完成。
整數(shù)有正數(shù)和負(fù)數(shù)的區(qū)別,所以計(jì)算機(jī)中使用最高位來來表示正負(fù)數(shù),其中0表示整數(shù),1表示負(fù)數(shù)。其它位表示數(shù)據(jù)位,比如:
正數(shù)7,在計(jì)算機(jī)中用一個(gè)8位的二進(jìn)制數(shù)來表示,是00000111,而負(fù)數(shù)-7,則用10000111表示
原碼、反碼、補(bǔ)碼
原碼 | 反碼 | 補(bǔ)碼 |
0000_0001 | 0000_0001 | 0000_0001 |
1000_0001 | 1111_1110 | 1111_1111 |
正數(shù)的原碼、反碼、補(bǔ)碼是一樣的,而負(fù)數(shù)的反碼等于源碼除符號(hào)位取反,補(bǔ)碼等于反碼在最低為加1。
這里就會(huì)產(chǎn)生兩個(gè)問題,第一個(gè)問題,為什么需要有反碼和補(bǔ)碼,它的意思是什么?第二為什么整數(shù)的反碼和補(bǔ)碼和源碼是一樣的。
首先在計(jì)算機(jī)中我們需要進(jìn)行加減運(yùn)算,但是會(huì)有下面的幾種情況出現(xiàn)
我們來看看如果直接使用原碼進(jìn)行加減是否可以?
1+(-1)=[0000_00001]+[1000_0001]=[1000_0010]=-2
我們可以看到正數(shù)相加的時(shí)候毫無問題,但是一旦出現(xiàn)負(fù)數(shù)的情況就完蛋了,我們可以看到1-1可以看成是1+(-1)結(jié)果確不等于0,而是等于-2,這顯然不符合我們的邏輯。
那么我們不使用源碼來表示了我們使用反碼來計(jì)算,
-1的原碼是[1000_0001]、反碼[1111_1110]
2的源碼是[0000_0010]、反碼[0000_0010]
-1+2=[1111_1110]+[0000_0010]=[0000_0000]=0
我們發(fā)現(xiàn)這也不符合邏輯,-1+2應(yīng)該等于0
那么下面我們?cè)賮硎褂醚a(bǔ)碼來試一下:
-1的原碼是[1000_0001]、反碼[1111_1110]、補(bǔ)碼[1111_1111]
2的源碼是[0000_0010]、反碼[0000_0010]、補(bǔ)碼[0000_0010]
-1+2=[1111_1111]+[0000_0010]=[0000_0001]=1
我們發(fā)現(xiàn)這個(gè)是符號(hào)我們的邏輯的,所以回答第二個(gè)問題,為什么要有補(bǔ)碼呢?這就是因?yàn)橹挥醒a(bǔ)碼可以保證我們的加減運(yùn)算是正確的,但是為什么會(huì)出現(xiàn)這種情況呢?
我們可以發(fā)現(xiàn)在負(fù)原碼中每增加一個(gè)二進(jìn)制單位對(duì)應(yīng)的是遞減的(1000_0001和1000——0000相比)按照道理來說1000_0001應(yīng)該比1000_0000大,但是事實(shí)確相反,而正每增加一個(gè)二進(jìn)制單位對(duì)應(yīng)的真數(shù)是遞增的,這個(gè)符合我們的需要,為了解決負(fù)數(shù)的這個(gè)問題,我們可以取反碼
我們可以發(fā)現(xiàn)反碼滿足了負(fù)原碼中每增加一個(gè)二進(jìn)制單位對(duì)應(yīng)的是遞增的(1111_1110和1111_1111相比,1111_1111比1111_11110大),解決第一個(gè)問題之后,還有第二個(gè)問題,這個(gè)問題就是0的問題,因?yàn)闆]有正0和負(fù)零的說法,但是上面確有正零和負(fù)零區(qū)別,這就導(dǎo)致了重復(fù)的問題,這個(gè)時(shí)候我們發(fā)現(xiàn)當(dāng)給負(fù)原碼加1,那么0就統(tǒng)一了,如下所示:
那么問題就解決了,那么還需要注意的是1000_0000這個(gè)反碼表示-128,所以補(bǔ)碼的表示范圍是[-128~127] ,這樣一來256個(gè)二進(jìn)制正好表示256個(gè)整數(shù)
碼距是指任意兩個(gè)合法碼之間至少有幾個(gè)二進(jìn)制位不相同。
僅有一位不同的編碼是無糾錯(cuò)能力的,例如用4位二進(jìn)制表示16種狀態(tài),則16種編碼都用到了,此時(shí)碼距為1。任意一個(gè)編碼狀態(tài)的四位碼中的一位或者幾位出錯(cuò),都會(huì)變成另外一個(gè)合法碼,那么這種編碼是沒有檢錯(cuò)能力的。
若用4個(gè)二進(jìn)制位表示8種合法的狀態(tài),那么就可以只使用其中的8個(gè)編碼來表示,另外8個(gè)為非法編碼,那么合法的碼距為2。因?yàn)榇藭r(shí)任何一位出錯(cuò)后都會(huì)成為非法碼,這樣有檢測(cè)一位出錯(cuò)的能力。
合理增大碼距,那么就能提高錯(cuò)誤的能力,但是會(huì)使用更多的二進(jìn)制,增加了電子路線的復(fù)雜性和數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)傳送的數(shù)量。
常用的檢錯(cuò)糾錯(cuò)碼有以下幾種:
先對(duì)原始數(shù)據(jù)使用校驗(yàn)碼進(jìn)行編碼(加進(jìn)特征),然后傳輸,傳輸完成之后進(jìn)行譯碼,然后判斷收到的碼字是否有問題
下面我們講解一下奇偶校驗(yàn)
原理是在k位數(shù)據(jù)碼之外增加1位校驗(yàn)位,使得K+1位碼字中取值1的位數(shù)總保持為偶數(shù)(偶效驗(yàn))或奇數(shù)(寄校驗(yàn)),舉一個(gè)例子:
對(duì)待傳輸數(shù)據(jù)10110110約定采用其校驗(yàn)時(shí),發(fā)送方所需要發(fā)送的校驗(yàn)碼為010110110,對(duì)于接收方來說,如果接收到的數(shù)據(jù)中’1’的個(gè)數(shù)不為奇數(shù)時(shí),就會(huì)認(rèn)為數(shù)據(jù)出錯(cuò)。但是它并不知道哪里出錯(cuò)了,也就是它沒有糾錯(cuò)的能力。