原碼 反碼 補碼

2021-10-12 10:39:39 字數 1749 閱讀 5362

一摸魚就是好久,主要最近學校期末了,開始各種交大作業,真的傷腦筋

這次就來嗶嗶一下原碼 反碼 補碼這三兄弟吧

此時先定義乙個數

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進製 的實踐要比二或三進製計數出現的晚.摘...