DrewJhung's Blog

负数的二进制为什么用补码表示

二进制表示

一个字节=8 bit,最高位表示符号位, 不计入数值。正整数最高位是0, 负整数最高位是1。

负数说:哼!我就不用补码

用不用补码都是人类赋予计算机的一种表示方式, OK , 我们不用补码, 就是根据上文中提到的正整数最高位是1,负整数最高位是0 的表示方式, 做个幼稚园的题目:3 - 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!-- 特别说明:① 为了方便, 这里的二进制表示均用1字节表示;② 计算机中只有加法电路-->
3的二进制: 00000011
-1的二进制: 10000001
<!-- 利用加法电路对上面2个数做加法-->
恒成立的表达式: 3 - 1 = 3 + (-1)
00000011
+
10000001
--------------------
10000100
<!-- 利用上述计算, 得到的结果是 3+(-1)=-4, 结果显然错误。 这意味着 整数加减法 需要2套电路实现:正整数+ 正整数、 正整数+负整数。 用原码表示负数既然不是很方便, 于是聪明的计算机科学家想到能不能改变的负数的表示方式, 使得整数相加减公用一套加法电路-->
3 - 1 其实它也是加法运算:3 + (-1)
-1 是 0 - 1的结果, 利用二进制表示 0 - 1:
00000000
-
00000001
--------------------
<!-- 显然, 这样做减法也减不开, 我们尝试借一位-->
100000000 00000011
- ----计算 3 + (-1)-----> +
00000001 11111111
-------------------- ------------------
011111111 000000010
<!-- 得到的结果是9 bit, 假设这是个8 bit机器, 第9位会被舍弃, 利用这种方法得到 3 + (-1) = 2。 在上面的式子中, 100000000 = 11111111 + 00000001, 利用 11111111 + 00000001 替换100000000, 核心原则:把一切减法的地方换成等价的加法运算 -->
11111111
-
00000001
----------------
11111110 <!-- 取反 -->
+
00000001 <!-- 加 1 -->
-----------------
11111111
上面的式子就是负数的取反加1的由来。

Reference

负数二进制的表示方式