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