原码、反码、补码
计算机存储数据是以补码的形式进行存储的
原码
- 已一个字节(8 位)为例
最高位为符号位,0 代表正数,1 代表负数,非符号位为该数字绝对值的二进制
反码
正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变。
补码
正数的补码与原码一致,负数的补码是该数的反码加一
5 | -5 | ||
---|---|---|---|
原码 | 0000 0101 | 1000 0101 | |
反码 | 0000 0101 | 1111 1010 | |
补码 | 0000 0101 | 1111 1011 |
1. 计算机存储数据是以补码的形式进行存储的
2. 正数的补码等于它本身
3. 负数的补码等于反码加一
ps:补充,计算机中的计算都是已存储单位补码进行运算的
- 因为计算机中只有加法没有减法,所以需要把减法转为加法,如下:
5 - 5 = 5 + (- 5)
逻辑一:使用原码计算
原码 | 原码 | ||
---|---|---|---|
5 | 0000 | 0101 | |
- 5 | 1000 | 0101 | |
同位数加 | 同位数加 | ||
结果是原码 | 1000 | 1010 | - 10 |
错误 |
逻辑二:使用反码计算
反码 | 反码 | ||
---|---|---|---|
5 | 0000 | 0101 | |
- 5 | 1111 | 1010 | |
同位数加 | 同位数加 | ||
结果是反码 | 1111 | 1111 | |
反码转换为原码 | 取反 | 取反 | |
原码 | 1000 | 0000 | - 0 |
两个不同的进制表示同一个数,矛盾了 | |||
0000 | 0000 | + 0 |
逻辑三:使用补码计算
补码 | 补码 | 补码 | ||
---|---|---|---|---|
5 | 0000 | 0101 | ||
- 5 | 1111 | 1011 | ||
同位加 | 同位加 | |||
1 | 0000 | 0000 | ||
去掉最高位 | 去掉最高位 | 去掉最高位 | 一个字节只有八位,所以去掉最高位 | |
0000 | 0000 | 0 |