反碼補碼原碼筆記(不斷更新)

2021-10-10 04:27:06 字數 3188 閱讀 1376

1000 0000 0000 0000 0000 0000 0001 0100 原碼

1111 1111 1111 1111 1111 1111 1110 1011 反碼

1111 1111 1111 1111 1111 1111 1110 1100 補碼(反碼變補碼,+1

1111 1111 1111 1111 1111 1111 1011 0000 左移兩位,低位補0

1111 1111 1111 1111 1111 1111 1010 1111 反碼(補碼變反碼,-1

1000 0000 0000 0000 0000 0000 0101 0000 原碼

2^6 + 2^4 = 64 + 16 = 80,高位為1,代表負數,就是-80

總結:原碼到補碼和補碼到原碼都是取反再加1,同時補碼到原碼也可以先減一再取反

把乙個二進位制數右移n位,規則為:

除符號位外,全部右移n位,

如果數字是乙個無符號數值,則用0填補最左邊的n位,

如果數字是乙個有符號數值,則用1填補最左邊的n位,

也就是說如果數字原先是乙個正數,則右移之後在最左邊補n個0;如果數字原先是個負數,則右移之後在最左邊填補n個1。

例子:0000 0010 >> 1 = 0000 0001

0000 1010 >> 2 = 0000 0010

1000 0010 >> 1 = 1100 0001

1000 1010 >> 3 = 1111 0001

上面的例子,正數的容易理解,為什麼負數的是填補n個1呢,解釋如下:

負數在計算機內部是以補碼形式存放的,同樣,正數也是以補碼形式,只不過正數的補碼和原碼一樣。即資料在計算機中是以補碼的形式儲存的,所以一般所指「二進位制」為數的補碼表示如果數字原先是個負數,則右移之後在最左邊填補n個1。

上面的例子是移位出來結果是整數,不用四捨五入的,下面例子是需要四捨五入的。

1000 1010 的原碼1111 0110(-118),右移三位1000 1110(-14)。實際結果為(-118/8=-14.75)。按照符號位擴充套件得到的補碼1111 0001對應的原碼是1000 1111(-15),更接近實際值。可以看到符號位擴充套件的優越性:即符號擴充套件位移位很接近於實際值

首先左移和右移的區別是很好區分的

左移<< :就是該數對應二進位製碼整體左移,左邊超出的部分捨棄,右邊補零。舉個例子:253的二進位製碼1111 1101,在經過運算253<<2後得到1111 0100。很簡單

右移》 :該數對應的二進位製碼整體右移,左邊的用原有標誌位補充,右邊超出的部分捨棄。

無符號右移》 :不管正負標誌位為0還是1,將該數的二進位製碼整體右移,左邊部分總是以0填充,右邊部分捨棄。

舉例對比:

-5用二進位制表示1111 1011,斜體為該數標誌位

-5>>2: 1111 1011-------------->1111 1110。

11為補充標誌位

-5>>>2: 1111 1011-------------->0011 1110。

00為補充的0

1)負數的右移:負數右移的話,由於要保持它是負數,所以負數的二進位制的右邊補1。如果一直右移的話,最後就就變成0xffffffff 即-1

如: -4>>1 為-2 ;-4>>2為-1

2)負數的左移:跟正整數左移一樣,右邊補0,一直左移的話,最後就是0啦。-2<<2 為-4 ; -2<<31為0

如-4(1000 0100),其補碼為1111 1100,>>1的結果是1111 1110,對應原碼是1000 0010(-2);<<2的結果1111 0000,對應原碼1001 0000(-16)

再給乙個溢位例子:-16378<<2 -16378的原碼是1011 1111 1111 1010,對應的補碼是1100 0000 0000 0110,<<2是通過補碼左移,為0000 0000 0001 1000,這時計算機看到是正數,所以原碼也是這個,即24

對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變:

對於負數的右移:因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼(符號位不變,其餘位按照原碼取反加1),然後保證符號位不變,其餘位向右移動到x位,在移動的過程中,高位補1.等移位完成以後,然後保持符號位不變,其餘按位取反加1,得到移位後所對應數的原碼。即為所求。

舉例1:

-100帶符號右移4位。

-100原碼: 10000000 00000000 00000000 01100100

-100補碼: 保證符號位不變,其餘位置取反加1

11111111 11111111 11111111 10011100

右移4位 : 在高位補1

11111111 11111111 11111111 11111001

補碼形式的移位完成後,結果不是移位後的結果,要根據補碼寫出原碼才是我們所求的結果。其方法如下:

保留符號位,然後按位取反

10000000 00000000 00000000 00000110

然後加1,即為所求數的原碼:

10000000 00000000 00000000 00000111

所有結果為:-7

舉例2:

-100無符號右移4位。

-100原碼: 10000000 00000000 00000000 01100100

-100補碼: 保證符號位不變,其餘位置取反加1

11111111 11111111 11111111 10011100

無符號右移4位 : 在高位補0

00001111 11111111 11111111 11111001

即為所求:268435449

總結:正數的左移與右移,負數的無符號右移,就是相應的補碼移位所得,在高位補0即可。 負數的右移,就是補碼高位補1,然後按位取反加1即可。

經典筆記

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...