再談反碼和補碼
幾天前我寫了一篇關(guān)于原碼反碼和補碼的文章,在這里。
里面有一個觀點:補碼是把減法變成了加法,這個觀點是有問題的。特此修正。
按照書上介紹這幾個碼的先后順序,我們可以看出一些端倪。先有的原碼,再有反碼,然后反碼有一些小問題,又引入了補碼,肯定是有什么不滿意的地方才引入新的概念來解決這個問題的,對不。
為什么說?”補碼是把減法變成了加法,這個觀點是有問題的“?這個觀點是錯誤的呢?
其實反碼才是把減法變成了加法。
不信可以看這里。
1-45,我們計算這個不用補碼就用反碼就能解決。
把1轉(zhuǎn)換為反碼,結(jié)果是1
把-45轉(zhuǎn)換成反碼。45的原碼是0010,1101,那么只需要把最高位的0改成1,就得到了-45的原碼,即1010,1101,那么它的反碼就是1101 0010
現(xiàn)在把0000 0001和1010 1101加起來。?
0000 0001
+?
1101 0010
=
1101 0011
最開始我們計算的是1-45?是一個減法,這里我們是用二進制的加法計算的,也就是說用了反碼之后就已經(jīng)把減法變成加法了。
最后的結(jié)果是1101 0011,它是一個反碼,那么它對應(yīng)的十進制數(shù)是多少呢?
按照反碼的規(guī)則逆過程,符號位不變,其它位取反得到1010 1100,這是一個原碼,對應(yīng)的十進制數(shù)就是-44
1-45?用十進制計算的結(jié)果就是-44,結(jié)果吻合。
既然反碼已經(jīng)把減法轉(zhuǎn)換成加法這個問題解決了,為什么還要引入補碼
那是因為還有一個小問題沒有解決,就是+0和-0的問題。
+0的反碼是0000 0000 ,-0的反碼是1111 1111,?同一個數(shù)有兩個反碼,怎么讓它相同呢?
給-0的反碼加一個1,得到0000 0000,這正好就是+0的反碼。
所以說反碼的引入是把減法變成加法,補碼的引入是解決+0和-0的反碼不一樣的問題的。