什麼是補碼,怎麼求補碼

2021-08-09 09:23:58 字數 2403 閱讀 3598

由此產生的疑惑更多了

到底什麼是符號位? 進而補碼又是什麼?

理由很簡單,計算機內部只有加法器,並沒有減法器

所以在計算機中,在我們人類眼中很簡單的算術運算2 - 3 = -1

計算機是無法完成的,那麼依照計算機只能做加法,很顯然的想到了2 + (-3) = -1

因此數在計算機中必然要有特定的表示,那麼補碼就誕生了。

無符號(unsigned)的乙個位元組的數表示如下:

0000 0000 = 0

0000 0001 = 1

0000 0010 = 2

...1111 1111 = 255

有符號數(signed)的乙個位元組的數表示如下:

0000 0000 = 0

0000 0001 = 1

0000 0010 = 2

...1000 0000 = 0

1000 0001 = -1

...1111 1111 = -127

問題出現了,0000 00001000 0000都代表著數字 000

不僅如此,且計算兩個數相加會非常複雜,比如:

0000 0010

+ 1000 1100

---------------

???? ????

因此範圍被定義為: −

128-128

−128

\leq

≤ x ≤

\leq

≤+127

+127

+127

雖然兩個 0 的表示問題解決了,但是計算問題依舊相當複雜,於是就引進了補碼

幾乎所有的教材都這樣寫到:

正數的補碼就是原碼

負數的補碼是符號位不變(1),其餘位取反,然後加一

並且給出以下定義:

乙個有符號數的最高位為符號位

0 代表這個數為正數

1 代表這個數為負數

依照這種定義,我們簡單的來進行幾個運算:

【例1】用補碼計算45 + 24

0010 1101

+ 0001 1000

---------------

0100 0101

正常答案69也是輕而易舉的求出來了

【例2】用補碼計算45 - 38

0010 1101

+ 1101 1010

-----------------

(1) 0000 0111

計算這一題的時候就有些猶豫了,因為進製已經到了符號位

那麼我的符號位到底參與運算嗎?

常理來說,符號位顧名思義,代表著數的正負,怎麼可以參與運算呢?

事實卻恰恰相反,符號位參與運算的結果才是正確的,如上例所示。

上述的例子說明了乙個非常矛盾的事情

把乙個數的最高位定義為了符號位,計算中符號位卻能參與運算

想必這也是很多人蒙在鼓裡的地方了

補碼的定義(以8

88位字長數為例):

表示範圍

x xx0

00≤

\leq≤xx

x≤\leq

≤+127

+127

+127

2

82^8

28-x xx−

128-128

−128

\leq≤xx

x<

0<0

<

0也就是說,正數的補碼就是原碼

而反碼的補碼等於位數 2

82^8

28減去 x

xx 的絕對值 ∣x∣

|x|∣x

∣,例如 −

38-38

−38 的補碼:

1 0000 0000

- 0010 0110

----------------

1101 1010

所以 −

38-38

−38 的補碼為1101 1010

在這種定義下,沒有反碼的概念,也沒有符號位的概念

參考:[1] signed int: bias/excess notation

什麼是原碼 反碼和補碼?

什麼是原碼 反碼 補碼?計算機中的符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位,三種表示方法各不相同。在數值前直接加一符號位的表示法。例如 7的原碼是10000111 正數的反碼與其原碼相同 負數的反碼是對其原碼逐位取...

補碼是什麼

點這裡獲得更好的閱讀體驗 補碼 2 s complement 是計算機用於表示諸如 20,17 這樣有符號整數的方式。如在 c 語言中 或者許多其他的靜態型別語言 整形資料型別int代表長度為 4 bytes 32 bits 的有符號數,可表示的範圍為 2 31,231 1 2 2 1 231,23...

快速簡單地求負數的補碼和求補碼代表的負數

快速簡單地求負數的補碼和求補碼代表的負數 特點是 快速簡單實用,不用教科書的取反加一之類的麻煩方法。1 這是我認為必要的基本知識 補碼,是整數數字資料在計算機內部的儲存格式。整數分為正數,0,和負數。1位二進位制數字可以表示2個不同的狀態,2位二進位制數字可以表示4個不同的狀態,3位二進位制數字可以...