C 筆記 原碼 反碼 補碼

2021-08-21 16:30:12 字數 1367 閱讀 1400

數值在計算機中是以補碼的方式儲存的,在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。

對於乙個數, 計算機要使用一定的編碼方式進行儲存。 原碼, 反碼, 補碼是計算機儲存乙個具體數字的編碼方式。

乙個數在計算機中的二進位制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號, 正數為0, 負數為1。比如,十進位制中的數 +2 ,計算機字長為8位,轉換成二進位制就是[00000010]。如果是 -2 ,就是 [10000010] 。因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 [10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130([10000010]轉換成十進位制等於130)。所以將帶符號位的機器數對應的真正數值稱為機器數的真值。

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值。

反碼的表示方法是:正數的反碼是其本身;負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反。

補碼的表示方法是:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1。 (即在反碼的基礎上+1)

舉例:十進位制數

原碼反碼

補碼85

0101 01010101 01010101 0101

-851101 01011010 10101010 1011

90000 10010000 10010000 1001

-91000 10011111 01101111 0111

那麼計算機為什麼要使用補碼呢?

首先,根據運算法則減去乙個正數等於加上乙個負數, 即: 1-1 = 1+(-1), 所以計算機被設計成只有加法而沒有減法, 而讓計算機辨別」符號位」會讓計算機的基礎電路設計變得十分複雜,於是就讓符號位也參與運算,從而產生了反碼。 

用反碼計算, 出現了」0」這個特殊的數值, 0帶符號是沒有任何意義的。 而且會有[0000 0000]和[1000 0000]兩個編碼表示0。於是設計了補碼,負數的補碼就是反碼+1,正數的補碼就是正數本身,從而解決了0的符號以及兩個編碼的問題: 用[0000 0000]表示0,用[1000 0000]表示-128。 

注意-128實際上是使用以前的-0的補碼來表示的, 所以-128並沒有原碼和反碼。使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示乙個最低數。 這就是為什麼8位二進位制, 使用補碼表示的範圍為[-128, 127]。

C筆記 原碼 反碼 補碼

機器數 1 乙個數在計算機中的二進位制表示形式,叫做這個數的機器數 2 機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為 0,負數為 1 如十進位制數 3 計算機字長為 8 位,轉換成二進位制就是 0000 0011 如十進位制數 3 就是 1000 0011 0000 0011和1000...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 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 當...