為什麼要用補碼表示

2021-08-24 22:34:47 字數 2096 閱讀 5250

用補碼的主要原因:使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄。n位計算機,設n=8,所能表示的最大數是11111111,若再加1稱為100000000(9位),但因只有8位,最高位1自然丟失。又回了00000000,所以8位二進位制系統的模為2(8)。在這樣的系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以了。把補數用到計算機對數的處理上,就是補碼[1]。

最直觀的得到乙個負數的補碼的方法是用2

8去減它,例如:

-1 的補碼 100000000
-) 00000001
------------
= 11111111 (實際上就是1 + (11111111 – 1),先計算括號內,相當於按位取反,然後再加上外面的1。
首先說說無符號數的表示,乙個位元組可以表示28

-1=256個數,00000000~11111111 分別表示0~255。這個很簡單。

對於無符號數,乙個位元組同樣只能表示256個數,那麼怎麼表示負數,乙個比較好的辦法就是將位元組的最高位表示為符號位,其餘7位表示數值,表示範圍為-128~127, 00000000~01111111表示0~127, 10000001~11111111表示-1~-127嗎,錯!,實際上是10000000~11111111分別對應表示-128~-1,怎麼會是這樣呢,是不是搞錯了,沒錯的,這就是補碼,負數在計算中是以補碼來表示的。

那麼補碼是怎麼得到的呢?為了說明這個問題,讓我們來先了解一下什麼是原碼和反碼的概念。

原碼:數值有正負之分,計算機就用乙個數的最高位存放符號(0為正,1為負).這就是機器數的原碼了,原碼表示範圍為-127 ~ -0, +0 ~ +127,除了最高位表示符號位,正負數在其餘各位的表示是相同的,例如10000001表示 -1, 11111111表示-127。原碼表示雖然很簡單,但人們很快就發現用原碼來進行加減運算會出問題:假設字長為8bits[2]

( 1 )

10-( 1 )

10 =( 1 )

10 + ( -1 )

10 =( 0 )

10(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 顯然不正確

因為兩個整數的相加沒有問題,所以問題出在帶符號位的負數上,人們將負數除符號位的其它位逐位取反,就得到了反碼。

( 1 )

10-( 2)

10 =( 1 )

10 + ( -2 )

10 =( -1 )

10(00000001)

反+ (11111101)

反 =(11111110)

反 =( -1 ) 正確

發現反碼表示後,將加減數都表示成反碼後,減法可以直接表示成加法,其結果似乎是正確的。但是:

( 1 )

10 -( 1 )

10=( 1 )

10+ ( -1 )

10=( 0 )

10(00000001)

反+ (11111110)

反 =(11111111)

反 =( -0 ) 有問題.

問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的,於是就出現了補碼,正數的補碼不變,負數的補碼是將其反碼加1,這樣表示後再看看上面的運算:

( 1 )

10-( 1 )

10=( 1 )

10 + ( -1 )

10 =( 0 )

10(00000001)

補 + (11111111)

補 =(00000000)

補 = ( 0 ) 正確

( 1 )

10-( 2)

10=( 1 )

10 + ( -2 )

10 =( -1 )

10(00000001)

補+ (11111110)

補=(11111111)

補 = ( -1 ) 正確

p.s.

一的補碼(one's complement) 指的是正數=原碼,負數=反碼

而二的補碼(two's complement) 指的就是通常所指的補碼

補碼原理 負數為什麼要用補碼表示

我們都知道負數在計算機中是以補碼 忘了補碼定義的戳這裡 表示的,那為什麼呢?本文嘗試了解補碼的原理,而要想理解它,首先得理解算術中 模 的概念。所以首先看一下什麼是模,然後通過乙個小例子來理解補碼。1.1 什麼是模數 in mathematics,modular arithmetic is a sy...

補碼原理 負數為什麼要用補碼表示

我們都知道負數在計算機中是以補碼 忘了補碼定義的戳這裡 表示的,那為什麼呢?本文嘗試了解補碼的原理,而要想理解它,首先得理解算術中 模 的概念。所以首先看一下什麼是模,然後通過乙個小例子來理解補碼。1.1 什麼是模數in mathematics,modular arithmetic is a sys...

負數為什麼用補碼表示

問 負數在計算機中如何表示?舉例來說,8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就是00001000,而 8則是100010...