源码、反码和补码

原码是一个数的二进制表示,二进制的最高位是符号位,0 表示正数,1 表示负数。符号位后面是数值位。

一个字节是 8 位,最大值位 01111111,换算为十进制是 127。最小值为 11111111,换算为十进制为 -127

利用原码计算正数是不会有问题的。但是计算负数就会有问题。

问题所在:

10000000 表示 -0。加上 1,得到 10000001,转为十进制,得到 -1。但是 0 加上 1 应该得到 1 才对。

-1 的二进制为 10000001,加上 1,得到 10000010,转化为十进制,得到 -2,但是 -1 加 1 结果应该为 0 才对。

-2 的二进制为 10000010,加上 1,得到 10000011,转化为十进制,得到 -3,但是 -2 加 1 结果应该为 -1 才对。

原因:一般情况,加 1 是往数轴的正方向进一位,但是因为符号位为 1 即数字本身是负数,导致加 1 是往数轴的负方向进了一位。因此,利用原码对负数进行计算,实际得到的结果和我们预期的结果相反。

解决方法就是计算负数时将数轴也翻转过来。于是出现了反码。反码是为了解决原码不能计算负数而出现的。

计算机的数的显示是用原码进行的,数的计算和存储是用补码进行的。

正数的原码,反码和补码都一样,即正数三码合一。

负数的反码的计算方式:原码的符号位不变,其他位取反,即 1 变成 0,0 变成 1。

负数的补码的计算方式:反码加 1。因此负数的反码等于补码减 1。即:

负数的补码 = 反码 + 1

负数的反码 = 补码 - 1

0 的反码和补码都是 0。

一般都是先根据一个数写出它的二进制表示,即得到原码,然后从原码得到反码,再从反码得到补码。最后用补码进行计算,计算结果是补码,再将这个结果转化为反码,再将反码转化为原码,最后输出原码。即:

一个数 → 原码 (二进制表示) → 反码 → 补码 → 进行计算 → 补码 → 反码 → 原码

计算得到补码时,如果补码的最高位为 0,说明是正数,则反码和原码也都和补码相等(三码合一)。

负数的原码就是绝对值的原码的最高位的 0 改为 1。

负数的计算,如果不跨 0,那么用反码计算是没有任何问题的。

在这里插入图片描述

但是入果跨 0 就会产生问题:

在这里插入图片描述

在这里插入图片描述

原因在于 0 出现了两次,这里的两个 0 都是加 1 得到的,-0 是 -1 加 1 得到,+0 是 -0 加 1 得到的。

为了去掉这两个 0 中的一个,于是出现了补码。补码就是把反码错开一位:

在这里插入图片描述

这样 0 就只有一种表现形式,即 00000000。这里只是将负数的反码错开一位,正数的原码、反码和补码都是一样的。

-128 没有原码和反码,只有补码。

[图片]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值