13-原码、反码、补码
一.为什么需要这些码
计算机底层只能存储0和1(二进制),那么如何用二进制来表示负数和进行减法运算呢?
人们最初的想法很简单:用比特位来表示正负。这就是原码。但原码在运算时遇到的麻烦,于是发明了补码,它完美地解决了这些问题,并成为现代计算机中整数表示的标准
二.原码
原码是最直观的表示方法
规则:
- 最高位(最左边的位)为符号位:0表示正数,1表示负数
- 其余位为数值位:表示该数的绝对值
举例:用一个字节,8位来表示
- +1:0000 0001
- -1:1000 0001
- +0:0000 0000
- -0:1000 0000
原码的优点:
- 非常直观,人类容易理解
原码的缺点:
- 存在”-0“:0000 0000 和 1000 0000都表示0,这在进行逻辑判断时会带来麻烦
- 运算复杂:计算机的CPU需要设计复杂的电路来处理符号位。例如:1+(-1),用原码计算是0000 0001 + 1000 0001 = 1000 0010 结果是-2,这显然是错误的
为了解决原码的运算问题,人们引入了补码
三.补码
补码是现代计算机中整数的标准存储形式。它巧妙地将减法运算转换为了加法运算
补码的定义和转换规则:
对于一个固定的位数(例如8位):
- 正数的补码:与其原码相同
- 负数的补码:由其对应的正数的补码,按位取反(得到反码),然后加1.例如要求-1的补码,先求1的补码(也是1的原码),为0000 0001 然后对它按位取反 得到1111 1110 最后+1得到 1111 1111 那么-1的补码就是1111 1111
举例(8位):
-
+1
:0000 0001
-
-1
:1111 1111
-
+0
:0000 0000
-
-0
: 计算-0
的补码:取反1111 1111
,加1后变成1 0000 0000
,由于只有8位,最高位1被舍弃,结果还是0000 0000
。补码中“0”的表示是唯一的!
0000 0001 (1的补码)
+ 1111 1111 (-1的补码)
---------------
1 0000 0000 (结果)
由于我们只有8位,最前面的1
(第9位)会自然溢出被舍弃,剩下的结果就是 0000 0000
,也就是 0
。结果是正确的!
补码的优点:
-
统一了0的表示:没有+0和-0之分。
-
将减法变为加法:CPU的ALU(算术逻辑单元)只需要设计加法器电路就可以同时处理加法和减法,大大简化了硬件设计。
-
A - B
=A + (-B)
,而-B
正好就是B的补码。
-
四.反码
反码可以看作是原码和补码之间的一个过渡产物
规则:
- 正数的反码:与其原码相同
- 负数的反码:其原码的符号位不变(也可以看作先求对应正数的原码,然后所有位都取反),数值位按位取反
举例(8位):
-
+1
: 原码0000 0001
-> 反码0000 0001
-
-1
: 原码1000 0001
-> 反码1111 1110
反码解决了原码的一部分运算问题,但仍然没有解决“-0”的问题:
-
+0
的反码:0000 0000
-
-0
的反码:1111 1111
在现代计算机中,反码本身并不用于直接表示数字,但它是在计算负数补码时的一个重要步骤。