由此產生的疑惑更多了
到底什麼是符號位? 進而補碼又是什麼?
理由很簡單,計算機內部只有加法器,並沒有減法器
所以在計算機中,在我們人類眼中很簡單的算術運算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 0000
和1000 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位二進位制數字可以...