原码和补码
为什么要引入补码?
通俗来讲,在计算机中使用原码进行计算,不好用。
使用补码的优势:
- 统一了加法和减法:使用补码,计算机可以用相同的加法硬件来处理减法,这简化了硬件设计。对于任何两个数,无论它们是正是负,都可以直接进行加法操作,而不需要判断操作数的正负。
- 消除了负零的概念:在补码表示法中,只有一个零(
+0
和-0
都表示为000
),这避免了在其他数值表示法中可能出现的正零和负零的区别。 - 提高了负数表示的范围:在固定位宽的情况下,补码能表示的负数比其他表示法(如原码或反码)多一个。例如,在 8 位二进制中,补码可以表示从 -128 到 +127 的整数,而原码和反码只能表示从 -127 到 +127。
- 简化了计算机的逻辑设计:由于补码的特性,许多逻辑和算术运算(如加法、减法、比较)都可以用更简单的逻辑电路来实现。
先以原码表示法,来体验一下。
二进制原码表示法
假设有 3 位 bit ,则能表示的所有状态为共有 8 中:
000
001
010
011
100
101
110
111
把 000
用来表示 0
:
000 = 0
把其余 0 开头的用来表示正数:
001 = 1
010 = 2
011 = 3
把 1 开头的用来表示负数:
100 = -0
101 = -1
110 = -2
111 = -3
缺点之一:是 000
和 100
都用来表示十进制数 0
,其中 100
即负态的零。
缺点之二,是计算结果不正确。
二进制补码表示法
0
和正数的表示不变
把 000
用来表示 0
:
000 = 0
把其余 0 开头的用来表示正数:
001 = 1
010 = 2
011 = 3
负数的表示需要做出一些改变,改变的核心有两点:
- 消除负态零
- 保证计算结果正确
把 1 开头的用来表示负数:
100 = -4
101 = -3
110 = -2
111 = -1
由于把 1
开头的 4 中状态,分别用来表示 -1 ~ -4
,负态零的问题得到了解决。
关于计算结果是否正确,如下:
可以看到计算结果正确。
如何快速的计算补码表示的十进制数
101
可以拆分为 100
和 001
,把它们加起来就能得到它所表示的十进制数,即 -4 + 1 = -3
。