雖說早就接受到「原碼」、『』補碼「、」反碼「這些詞,但始終不能確切體會到它們的真實用處。
這種感覺讓人不爽,所以乾脆查查資料,先給自己找個不錯的原因做為思想的動力。
1.首先說說計算機為什麼用二進位制編碼形式?
相信大家大致都清楚。這是德國數學家萊布尼茨提出的。
由於正好二進位制裡的0和1,正好和計算機內部用高低電平來表示資料的模式是對應的。
而且利用二進位制,在開關開與閉,電壓高與低的資料表示上不僅狀態對應,而且很方便。
所以二進位制就成了計算機的內部語言。
2.有了二進位制,為何還要有十六進製制,八進位制,bcd碼呢?
有十進位制那是當然了,那是我們固有的思維,那當然不能丟了。現在系統位數都32或是64位了,
用二進位制表示太冗長了,所以十六進製制等才誕生了。個人認為有了十六進製制,既能解決書寫問題,
也能解決二進位制與十進位制的換算問題(雖說本來就能換算,但個人認為,二進位制轉成十六進製制後,
再轉十進位制,固然方便些,反著也一樣,不然長除法除2還不知道要除多少次呢)。可為什麼還要
八進位制,bcd碼呢,人真是沒事兒找事兒做嗎?其實也不算了,有梨子就不要蘋果了嗎,只要有
營養,都栽種,我想後面兩種碼制就是為了增加轉換途徑吧,就像到達終點一樣,多多少少還是要
有幾個行走的途徑吧,以不至於在一條路上把人給擠死。
3.數制轉換
雖說簡單,再次梳理熟能生巧。覺得熟悉的也可以認識認識幾個單詞,說不定你有不認識的單詞。
再次留給大家腦袋中梳理,我也不一一贅述了。
decimal to binary: 整數部位除2取餘,小數部位乘2取整
binary to decimal:
decimal to octal:
octal to decimal:
decimal to hexadecimal :
hexadecimal to decimal:
4. 有這麼多碼制,為什麼要用補碼來儲存資料呢?
查了網上的,就覺得有篇《閒扯原碼反碼補碼》寫得蠻好的,**如下:
不過個人還是覺得應該弄得再透一點,免得總是一回熟二回生的。
(i)為什麼不能用原碼?
( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)
原+ (10000001)
原= (10000010)
原= ( -2 ) 顯然不正確.
通過上面原碼計算式可以看出,當正數加上負數時,結果本應是正值,
得到的也有可能是負值(為什麼是說有可能,其實就是被減數與減數相加數值超過0111 1111,
即127,就會進製,從而進製使符號位加1變為0了,這時結果就是正的了,
不過這時我又會想,符號位也要參與運算嗎?待會兒我再解答),
而且數值部分還是被減數與減數的和,顯然謬誤。
例子:5-3=2;
(0000 0101)原+(1000 0011)原=(1000 1000),即-8,明顯不符。
當負數加上負數時(這裡就拿兩個數值部分加起來不超過0111 1111的來說),我們可以明顯
看出符號位相加變為0,進製1被溢位。結果就是正數了,更是讓人吃驚。
因此原碼毫無疑問的被排除了。
符號位參不參與運算?
上面我都用到了乙個假設,就是符號位參與運算。
我第一反應就是計算機會不會對符號位特殊對待呢?想了一會兒,證明自己還是很愚蠢的。
例子:5-3=2;
(0000 0101)補+(1111 1101)補=(1 0000 0010),溢位的1除掉,結果就是正數2.
上面補碼運算中我們雲算了符號位,若是算符號位,那結果符號位又該是什麼呢?我們知道
是正的,但計算機畢竟不是人的頭腦,它就難從0 和1裡抉擇了,所以說,計算機對待每一位
都是公平的。我是不是很愚蠢啊。
(ii)為什麼不能是反碼?
針對這點,我覺得上面部落格裡說不過去,向來特殊不能說明一般的。
我喜歡從例子中看出名堂,下面說說一例。
例子:-8-3=-11,
(1111 0111)反+(1111 1100)反=(1111 0011),再求其反碼,可得是1000 1100,即-12
為什麼結果就小了乙個1呢?我想到反碼加1就是補碼,其間一定有什麼不可告人的秘密呵呵。
下面我就用十進位制思維思考了:
1111 0111數值部分為119,即(127-8),1111 1100數值部分為124,即(127-3),
本來119+124=243,超過了127,進了一位加到符號位上去了,於是結果為243-128=115,
正是1111 0011 的數值部分。然後127-115,就是12呢,結果就是這樣來的。
你看出其中的破綻沒?
也許我把你給繞暈了吧。我們假定上面的127為x,
則根據上面流程,結果數值部分就為x-[ (x-a)+(x-b)-(x+1)],
這裡a、b都是指數值部分,結果化簡就是a+b+1.本來兩個小負數相加,是a+b,現在卻大了1,
再添個負號,自然算出的結果比正常結果小了1 了。這下明白了吧。
問題就出在(x+1)身上,本來總共表示的最大數值部分是127,你卻一下子就減掉128(這就預設了
最大數值應該存在128,可事實不存在),就像一塊土地只有一寸大,你卻想在其上建個占地面積兩寸的房子,
顯然不符合常理。因此反碼也癟下去了。
(iii)那又為什麼最後落到了補碼身上了呢?
如果是數學題,而且只有這三種碼,我的目的就已經達到了。不過我還是想看看補碼到底怎麼就行得通的呢。
其實知道反碼和補碼就是因為乙個1的差別,到底怎麼彌補呢?
要想建兩占地寸的房,就得把地開荒到兩寸。因此某某就把非分之想施加到『0』的身上了。
無中生有的把0分為正0和負0,然後負0變成-128,這樣數值範圍就增加了1,這樣就和上面運算吻合了。
現在無非是這些特殊數的各種碼表示問題。
以下摘自於相信對你也很有啟發。
我們都知道,數值在記憶體裡都是以補碼形式儲存的。正數的原反補都一樣,負數的補碼等於原碼的反碼加1.
但對於0來說,它有符號位嗎?
以乙個8位的系統來說,有符號數的二進位制為(1000 0000),表示的是-0,還是-128呢?
看看負數補碼的公式:負數的補碼=1 0000 0000(模)- 數的絕對值
比如:-1: 1111 1111 =1 0000 0000 - 0000 0001
-2: 1111 1110 =1 0000 0000 - 0000 0010
假設1:表示-0。
那麼 -0的補碼: 1 0000 0000 - 0 =0000 0000,和+0一樣。
反碼: 1111 1111 (0000 0000 -1 = 0000 0000 +1111 1111=1111 1111)
原碼: 1000 0000(反碼取反)
假設2:表示-128。
-128的補碼: 1 0000 0000 - 1000 0000(+128沒有符號位)= 1000 0000
反碼: 1111 1111 (1000 0000 -1 =1 000 0000 + 1111 1111 = 1111 1111)(補碼-1)
原碼: 1000 0000(反碼取反)
從上面看來,乙個原碼對應了2個補碼。按照c語言的定義,在32位的系統裡,int表示的範圍為-2^31 ~ +(2^31-1),那麼可以推論出有符號數可以表示負的最大值,而沒有-0的定義。也就是說上面1000 0000 表示的應該是-128,而不是-0。
關於運算,雖說簡單,但要想確確實實知道計算機怎麼處理的,還是很讓人有動力的。
下篇打算想想補碼如何在運算過程中大顯神通的,歡迎來訪。
初識iBeacons,一見鐘情。
ibeacons是蘋果在2013年wwdc上推出一項基於藍芽4.0 bluetooth le ble bluetooth smart 的精準微定位技術,當你的手持裝置靠近乙個beacon基站時,裝置就能夠感應到beacon訊號,範圍可以從幾公釐到50公尺。ibeacons相比較於原來的藍芽技術有幾個...
讓面試官對你「一見鐘情」
都說管理是一門藝術而非技術,其實,道 和 術 在管理中總是相輔相成的,人才管理也不外乎此。利用 需求風格特徵 有針對性地做好員工的管理與激勵,是術的一種,更是道的體現。每年的這個時候,有很多同學已經走上工作的崗位,對於剛開始找工作的同學來說面試是個坎兒。其實這些問題無非歸類為兩種,一種是技能類的問題...
C 單例模式之一見鐘情
單例模式就是保證乙個類有且只有乙個例項物件的一種機制並且提供乙個訪問他的全域性方法 相信每個人都渴望純潔的愛情,希望找到哪個唯一的他 她 不管你是單身,還是已經成雙成對,肯定都希望你的伴侶時唯一的!程式如人生,有些類我們也只希望它只有乙個例項。include using namespace std ...