1. 程式人生 > >正數、負數求原碼、反碼、補碼

正數、負數求原碼、反碼、補碼

二進位制,有符號數,首位為1的是負數,首位為0的是正數。(規定)
無符號數沒有正負之分,所以也沒有首位的限制。(規定)
以下示例皆以八位二進位制表示)

無符號數

無符號數的原碼、反碼、補碼都一樣,皆為該數的二進位制表示法

原碼 反碼 補碼

定義

無符號數的原碼為該數的二進位制表示法
無符號數的反碼與原碼一樣
無符號數的補碼與原碼一樣

舉例

1(無符號數)==>0000 0001(原碼)==>0000 0001(反碼)==>0000 0001(補碼)

正數

正數的原碼、反碼、補碼都一樣,皆為該數的二進位制表示法(同無符號數差不多)

原碼 反碼 補碼

定義

正數的原碼為該數的二進位制表示法。
正數的反碼與原碼一樣。
正數的補碼與原碼一樣

舉例

1==>0000 0001(原碼)==>0000 0001(反碼)==>0000 0001(補碼)
首位為0的表示正數,所以原碼、反碼和補碼的首位都是0

負數

原碼

定義

負數的原碼為該數對應的無符號數的二進位制,將首位置1。

舉例

-1==>1(無符號數)==>0000 0001(無符號數的二進位制)==>1000 0001(原碼,首位置1)。
(負數的首位為1)

反碼

定義

負數的反碼為該數原碼的符號位不變,其它位取反。

舉例

-1==>1000 0001(原碼)==>1111 1110(反碼,符號為不變,其它位取反)。
(負數的首位為1)

補碼

定義

1、負數的補碼為該數對應的無符號數的二進位制取反加一。
2、負數補碼(首位為1)減一,取反表示的是這個數的無符號數的二進位制。

舉例

1

-128==>128(無符號數)==>1000 0000(-128的無符號數的二進位制)==>0111 1111(取反)==>1000 0000(補碼,加一)(負數的首位為1)
-1==>1(無符號數)==>0000 0001(-1對應無符號數的二進位制)==>1111 1110(取反)==>1111 1111(補碼,加1)(負數的首位為1

)

2

1000 0000(補碼) ==> 0111 1111(減一) ==> 1000 000(取反,無符號數128)==> -128(負數)(負數的首位為1)
1111 1111(補碼) ==> 1111 1110(減一) ==> 0000 0001(取反,無符號數1) ==> -1(負數)(負數的首位為1)

後記

計算機皆使用補碼。用補碼計算,符號位也可以參與運算。若以原碼計算,符號位參與運算資料會出錯,所以還需要識別符號號位,會造成電路設計複雜,故拋棄。若以反碼計算,會存在+0與-0的問題,而0在人們的常識中是不存在正負之分的,所以也拋棄。
補碼取反加一為該數的相反數(補碼) eg: 1 ==> 0000 0001(補碼)==>1111 1110(取反) ==>1111 1111(加1) ==> -1
因為二進位制有位數限制,所以表示的數大小也有限制,8位表示的無符號數返回為0(0000 0000(補碼))~256(1111 1111(補碼)),有符號數為-128(1000 0000(補碼))~127(0111 1111(補碼))