在我們進行計算機的知識學習過程中,很多基礎教材一開始就向我們介紹計算機的三種編碼,即原碼,反碼,補碼三種形式;相信大家對這三種編碼都會多少留有印象,事實上,計算機的儲存系統以位元(bit)以基本單位,乙個位元代表乙個0或1,很多很多的位元來共同完成計算機的內部儲存。由於這種儲存結構只能儲存二進位制的數字,原碼,反碼,補碼就是計算機儲存實際數字的方法!
1.原碼的第乙個位元位為數字符號位,0表示正數,1表示負數,後面位數為十進位制數字的二進位制表示;
2.負數的反碼為原碼的除第乙個符號位之外,其他的位置數字全部取反;正數的反碼不變;
3.負數的補碼為反碼除符號位的二進位制數字再加1,即補碼為原碼取反再加1;正數的補碼不變。
這樣的定義基本上會出現在每一本計算機入門書籍或是涉及到計算機的內部儲存結構的書籍上,但是為什麼要這樣子定義三種編碼,這樣子定義又有什麼樣的好處呢?本文將從數學原理的角度向讀者深入的揭示三種編碼的奧秘!
事實上,對於一台計算機而言,對所有的數字只是單純的支援加法(對二進位製做減法過於複雜,因此計算機只有加法器的實現),即二進位制的傳統加法滿一進一法則;而對於減法操作,計算機採取的方法是讓減數加上被減數的相反數來實現的。因此在我們的討論中只考慮正數的加減,這樣就可以把所有的加減操作全部覆蓋了。
由於計算機只可以對加法進行操作,即計算機本身是不認識所謂的正數和負數的,它只會對兩個數字進行盲目的二進位制相加;我們以16個位元儲存單位為例,他的二進位制儲存可以表示的數字範圍為
0 ≤x
<
65535
0\leq x<65535
0≤x<65
535因此,我們要成功表示負數的目的就是建立二進位制數字與實際數字的乙個雙向對映,他能夠將一些二進位制數對映為不同的正數,將另一些二進位制數對映為不同的負數;我們很容易想到的就是將所有的二進位制數字直接分成兩個部分,通過如下規則完成對映
f (x
)=
x(x<32767)\\ 32768-x(x>32367) \end \right.
f(x)
=
x<21
5時從小到大表示正數,而當第一位為1時,即x
>215
x>2^
x>21
5時表示負數;這個對應法則直觀的描述就是
原碼的第乙個位元位為數字符號位,0表示正數,1表示負數,後面位數為十進位制數字的二進位制表示
很明顯,這樣的儲存方式有兩個問題存在:
1.對於0而言,有兩種不同的表示形式;
2.對於正數的相減,原碼加法會出現明顯的錯誤:他忽視負號的作用,將正數的絕對值與負數的絕對值直接相加最後再賦值負號
第乙個問題影響並不是很大,無非只是浪費了乙個數字的儲存空間,但第二個問題影響就會很大了!他直接讓我們對減法無從下手,為了解決問題二,我們試著去尋找相應的解決辦法來實現減法。
我們希望通過二進位制加法來實現減法,這需要我們重新建立對應法則關係,我們讓正數的對應法則不變,去考慮改變負數的對應法則,我們首先希望能夠做到正數減去它本身得到0;我們將原碼的負數對映由單調遞減改變為單調遞增,得到如下對映:
f (x
)=
x(x<32767)\\ x-65535(x>32367) \end \right.
f(x)
= x(065535) \end \right.
f(x)=⎩
⎪⎨⎪⎧
x(0
<
x<32
767)
x−65
534(
3236
7<
x<65
535)
f(x−
6553
6)(x
>65
535)
通過這樣的對映,我們同時解決了發生溢位後的對映問題與0的唯一性問題,實際上,這就是補碼的實現:
負數的補碼為反碼除符號位的二進位制數字再加1,即補碼為原碼取反再加1;正數的補碼不變。
事實上,補碼通過取模思想的對映解決了計算機的加減法的所有問題
至此,我們的原碼,反碼,補碼數學之旅到此結束!可能從這種角度理解可能非常晦澀,但這種思考方式卻是理解很多計算機設計原理的重要方式!
深入理解simhash原理
lsh locality sensitive hashing 是區域性敏感性hashing,它與傳統的hash是不同的。傳統hash的目的是希望得到o 1 的查詢效能,將原始資料對映到相應的桶內。lsh的基本思想是將空間中原始資料相鄰的2個資料點通過對映或者投影變換後,這兩個資料點在新的空間中的相鄰...
HDFS原理深入理解
1 hdfs概述 1 資料量越來越多,在乙個作業系統管轄的範圍存不下了,那麼就分配到更多的作業系統管理的磁碟中,但是不方便管理和維護,因此迫切需要一種系統來管理多台機器上的檔案,這就是分布式檔案管理系統 2 是一種允許檔案通過網路在多台主機上分享的檔案系統,可讓多機器上的多使用者分享檔案和儲存空間。...
深入理解hashmap的原理
一 什麼是雜湊?雜湊也叫雜湊,是將不同長度的輸入通過乙個函式轉換成同乙個長度輸出的過程,這個輸出的值叫雜湊值,這個轉換函式叫雜湊函式,雜湊函式所採用的演算法加雜湊演算法。實際上是乙個通過訊息得到訊息摘要的方法 二 什麼是雜湊表?雜湊表是乙個通過key訪問value的資料結構,它是基於乙個陣列,存資料...