一摸魚就是好久,主要最近學校期末了,開始各種交大作業,真的傷腦筋
這次就來嗶嗶一下原碼 反碼 補碼這三兄弟吧
此時先定義乙個數
int i =
1;
由於實在懶,就不取那麼大的數了,1多好,簡簡單單
原碼指的是乙個數的二進位制表示,那麼1就是
00000000 00000000 00000000 00000001
但是,正數的原碼 反碼 補碼都是一樣的,所以。。。例子失敗了
那就換個例子吧
如果此時給出一串二進位制
11111111 11111111 11111111 11111110
這個數代表的是多少?
剛看到的人可能一看,哇,這麼多的1,得算到啥時候去,其實不然
首先我們需要看的是第一位,也就是這個
11111111 11111111 11111111 11111110
在二進位制中第一位如果是1就代表著是負數,如果是0就代表著正數,不會有人連這個都不知道吧,那你現在就知道咯
所以這個數其實是個負數,而在進行儲存時,負數儲存的其實是補碼,所以為了知道這串二進位制代表的真正是數字是多少,我們還需要把他變成原碼才行,也就是說
11111111 11111111 11111111 11111110
是這個數的補碼
那麼怎麼換成原碼呢,這裡講一講原碼變成補碼的步驟
首先原碼要求反變成反碼,隨後由反碼 +1 變成補碼
感覺有點麻煩的亞子,可是為了c語言設計的方便,就把他設計成了只能進行加運算,負數也只能這麼麻煩了,從某些意義上來講還引起了不錯的重視咧
但是這裡要求的是原碼,害,數學逆運算嘛
我們這串二進位制是
11111111 11111111 11111111 11111110
那首先我們需要把他變成反碼,反碼變成補碼是要 +1
那我們就 -1
11111111 11111111 11111111 11111110
-111111111 11111111 11111111 11111101
很簡單的計算嘛,就是向前借一位,而二進位制中前一位的 1 代表著 2 ,所以減完 1 前一位就是 0 ,後一位就是 1 了,邏輯想通了就特別簡單,所以
11111111 11111111 11111111 11111101
就是這個數的反碼
接下來再給這段二進位制求反,你先求反得到了這個,那這個再求反就變回原來的亞子,沒毛病吧
11111111 11111111 11111111 11111101
求反10000000 00000000 00000000 00000010
注意哦,第一位可不能變的,那是代表著符號的位,不然乙個負數就變成正數了
那此時再來看這個數,會發現這個數竟然只是乙個小小的 -2 ,但是儲存的時候存了個補碼老多 1 了,即
10000000 00000000 00000000 00000010
是這個數的原碼
總結一下
原碼 (取反)→反碼
反碼(+1)→補碼
負數在進行儲存時存的是補碼
正數的原碼反碼補碼都是一樣的
判斷正負的時候需要看他二進位制的第一位,是0就是正數,是1就是負數
在進行原碼反碼補碼之間變化取反時第一位的數字是不變的(但是需要注意的是如果直接對數字取反如: ~-2 時符號位需要變化)
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 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進製 的實踐要比二或三進製計數出現的晚.摘...