原碼,反碼,補碼

2021-06-22 06:45:02 字數 1333 閱讀 7689

有時候在程式設計的時候,跟蹤**查錯,明明傳過來的-1,但結果顯示的是

0xffff;其實這就是-1的補碼。了解原碼,反碼,補碼對自己程式設計還是有一定

幫助的,之前也只是模糊的了解一點,最近查了一些資料,記錄下來,以免自己

忘記原碼:因為我們看到的十進位制數,存入計算機的時候,都會轉化成二進位制,

計算機只認識二進位製碼。比如:「3」 -> 0x0000 0011;

反碼:原碼為正數時,和原碼一樣。負數時,除了第一位符號位,其餘位置取反

,補碼:原碼為正數時,和原碼一樣。負數時,等於反碼+1,

公式:[+1] = [00000001]原 = [00000001]反 = [00000001]補

[-1] = [10000001]原 = [11111110]反 = [11111111]補

為什麼要反碼和補碼呢?原碼不就可以了解決問題了嗎?

比如:1 - 1 = 0;

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

為什麼變成1 + (-1)呢? 因為計算機很笨,只認識+法,不認識減法;也不認識

乘除法,我們寫程式能做加減乘除,都是轉變成+來完成的。具體怎麼轉換,可以查

一些資料,主要是用到移位和各種操作符號的結合,最終轉換為+運算。

回歸主題,很明顯-2不是我們要的結果,對吧。

用反碼運算:

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

能得到我們要的結果,但是,結果為「-0」,0 是不分正負號的,這樣做很明顯

有會多占用乙個位置;

用補碼運算:

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

這樣的結果,就不會帶符號了,符合我們的要求;

程式中使用二進位製碼,會提高我們的程式執行效率,以及減少空間。當然大多數

情況是體現不出這種效率的。但是了解之後用來調錯還是不錯的。

網上有很多利用原碼,補碼,反碼,來解決日常經常碰到的一些問題:效率都非

常高,而且也比較簡潔;

比如:交換2個數;

a^=b;

b^=a;

a^=b;

這樣就實現了,a和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 當...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 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進製 的實踐要比二或三進製計數出現的晚.摘...