原码 && 反码 && 补码

本文假定所有数据均使用 short 类型表示(2 个字节,共 16 位)。

前置知识(十进制转二进制)

原码

  1. 由于计算机中只能显示 1 和 0,因此采用二进制表示数据

  1. 同样,由于计算机中只能显示 1 和 0,没有负号-,因此,要表示正负也必须通过 1 和 0,我们规定每个数字最左边的一位叫做“符号位”。

符号位是 11,表示负数,例如:-5_{10} = 1000\ 0000\ 0000\ 0101_2−510=1000 0000 0000 01012,其中最左边的 11 表示负数,右边的 101101 表示 55。
符号位是 0,表示非负数,例如:5_{10}=0000\ 0000\ 0000\ 0101_2510=0000 0000 0000 01012。

另外,还有一个特殊情况,00 分为 \pm 0±0,原码里有 两个00

+0=0000\ 0000\ 0000\ 0000_2+0=0000 0000 0000 00002
-0=1000\ 0000\ 0000\ 0000_2−0=1000 0000 0000 00002

优点

原码几乎直接和二进制表示对应,可读性很强,通常用于人类阅读。

缺点

  • 由于正负的规定只在符号位,因此不能满足计算。

  • 存在 两个00 没有意义。

因此,我们需要另一种编码解决这样的计算问题。

反码

  1. 对于所有正整数,和原码一样;

  1. 对于所有的负数,均将其原码按位取反,符号位不变。例如:-5_{10} = 1111\ 1111\ 1111\ 1010_2−510=1111 1111 1111 10102

  1. 反码同样有 两个00

+0=0000\ 0000\ 0000\ 0000_2+0=0000 0000 0000 00002
-0=1111\ 1111\ 1111\ 1111_2−0=1111 1111 1111 11112

这样解决了加法问题吗?

再看看这个:

由于在反码中多了一个 -0−0,有 -0+1=+0−0+1=+0 的奇葩情况出现。

所以,每当一个负数和一个正数相加,结果若非负,则应该再补加 11。因此,反码亦不适合计算。

补码

我们考虑 16 个位的二进制加法形如一个循环:

  1. 对于所有正整数,和原码一样;

  1. 对于所有的负数 xx,我们将其变为 0-x0−x 的值,00 不够减,直接向前借位。

所以,通过观察,我们发现原码转补码的过程非常简单:

从左往右,除符号位以外,所有的位全部取反,直至最右边的 11 停止,最右边的 11 保持不变。

补码转原码 的过程与 原码转补码 的过程一样

练习:

  • 求 -30−30 的补码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值