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