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