1. 程式人生 > >關於原碼,反碼,補碼和左右移位的若干思考

關於原碼,反碼,補碼和左右移位的若干思考

1.為什麼要使用原碼,反碼,補碼 1)負數二進位制怎麼表示? 答:在原碼中,高位為1就表示負數 2)計算機如何實現減法? 1-1=? 答:對於計算機,邏輯運算應該設計的簡單,1-1可以表示為1+(-1),故沒有減法,用加法實現減法。

1 - 1 = 1 + (-1) = [00000001] + [10000001] = [10000010] = -2

如果用原碼錶示, 讓符號位也參與計算, 顯然對於減法來說, 結果是不正確的.這也就是為何計算機內部不使用原碼錶示一個數.

為了解決原碼做減法的問題, 出現了反碼:

計算十進位制的表示式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

3)0的二進位制怎麼表示,+0和-0有區別嗎? 答:+0和-0,但是補碼都為0,計算機中使用的是補碼,故計算機中無+0和-0區分 理由: +0的原碼,反碼,補碼,都是00000000 
-0的原碼是10000000反碼是11111111 ,而補碼是00000000

補碼解決了0的符號的兩個編碼的問題:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 

                      = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原=0

4)8位,-128的原碼是多少? 答:-128沒有原碼,原碼的表示範圍為[-127, +127],  計算機用補碼錶示,由於去掉了-0, [1000 0000]補 就是-128. 可以表示用來表示最小值-128,補碼的表示範圍為
[-128, 127] 2.為什麼左移是邏輯運算,右移是算術運算 左移是邏輯運算,右移是算術運算 邏輯移位是連標誌位(正負號)一起操作的,所以可能會改變正負號。 而算術移位是固定好標誌位,移動其他的位,不會改變正負號,但前面被移動的位是補0還是補1,如果標誌位是1,則都補1,是0,則都補0。 答:如果負數右移補0,一是負數變為了正數,補1的話,由於計算機都是補碼錶示,由於恰到好處 3.左移等於*2,右移等於/2,對負數也適合嗎 答:是適合的,原來理解錯誤,是由於從原碼角度考慮了,沒有從補碼角度考慮,計算機是用補碼進行運算的。輸出的進位制數也是補碼。 本例int是32位,4位元組,所以16進位制共8位