计算机基础

博客介绍了二进制中源码、反码、补码的概念及转换方法,以5和 -5为例进行说明。同时解释了负数二进制用补码表示的原因,原码做减法有问题,反码存在0的符号分歧,而补码解决了0的符号问题,统一了计算机加减法运算,还扩大了数值表示范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二进制中什么是源码、反码、补码?

原码:

一个正数,按照绝对值大小转换成的二进制数就是正数的原码
一个负数,按照绝对值大小转换成的二进制数,然后最高位补1,就是负数的原码

比如

00000000 00000000 00000000 00000101 是5的原码。

10000000 00000000 00000000 00000101 是-5的原码。
反码:

正数的反码与原码相同
负数的反码为对该数的原码除符号位外各位取反

正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101

负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。
补码:

正数的补码与原码相同
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1

比如:10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。
转换为十六进制:0xFFFFFFFB。
原博客

负数二进制为什么要用补码表示?

首先,我们应该清楚,原码是方便给人看的。看到一个数的原码,我们就能根据符号位和后边的二进制位,计算出这个数的实际值。为了简单起见,我以一个字节8位来举例,如

// 1 的原码 ,最高位0代表正数
0000 0001
// -1 的原码, 最高位1代表负数
1000 0001

可以看到,1和 -1 的原码只有符号位不同。然后,思考一个问题,1 - 1 = ?

是的,我们可以直接通过减法去计算,得出1-1=0 。但是,做减法运算时,可能会遇到不够减而需要借位的情况,这显然是比较麻烦的。我们换一种思路。 1-1 在数学中等同于 1+(-1)。这样,把减法转换为加法就简单的多了,只需要考虑进位就可以了。(其实,计算机中只有加法器,没有减法器,因此减法是通过加法器来计算的。)

于是,我们看下,把1和-1的原码相加等于多少(需要让符号位也参与运算)

  0000 0001
+ 1000 0001
  1000 0010

结果是 -2 ,这显然不符合我们的预期。

为了解决原码减法的问题,于是,出现了反码。使用反码,再来计算一下。

// 1的反码,同原码
0000 0001
// -1的反码,符号位不变,其他取反
1111 1110

相加之后,得 1111 1111 ,这是反码,转为原码为 1000 0000 ,即为 -0 。

但是,这又有问题了,在数学中0就是0,怎么到这还有 -0,+0之分。按照原码的概念来算,+0的原码为0000 0000 , -0 的原码为 1000 0000 。问题就出在这了,如果遇到0的计算,是应该用 +0 还是用 -0 计算呢,这就会产生分歧。于是,补码出现了,解决了0的符号问题 。

// 1的补码,同原码
0000 0001
// -1的补码,反码 +1
1111 1111

相加得 1 0000 0000 ,最高位进位之后,超过了8位,于是舍去,即为0000 0000。此为补码,转为原码也是0000 0000 ,这不就是0 吗。

这样一来,用补码0000 0000来表示0,就解决了+0和-0在原码上的分歧,统一了0的二进制表示方法。

那,又有疑问了,-0跑哪去了呢? 其实,-0即1000 0000在这用来表示 -128。但是,注意表示的是 -128的补码,因此 -128没有原码和反码。

那为什么用 1000 0000表示 -128呢 ?

先看下 -127 的原码、反码和补码:
原码: 1111 1111
反码: 1000 0000
补码: 1000 0001

我们知道数学中 -127 -1 = -128 ,所以 -127的补码 -1 也应该等于 -128的补码,即
1000 0001 -1 = 1000 0000。因此1000 0000就是 -128的补码。

在一个字节8位中,如果用原码来表示值的大小范围,只能是 1111 1111 ~ 0111 1111,即-127~127 。但是,如果用补码就可以表示 -128~127,正好是2^8,256个数。

因此,-0可以表示一个最低数。在8位二进制中它是1000 0000 ,在32位中,它就是 1000 0000 0000 0000 0000 0000 0000 0000 ,int的最小值。(32位数值大小范围为 -2^31 ~ 2^31 -1)

总结:补码的存在解决了0的符号问题,同时统一了计算机的加减法运算。补码是为了按位进行加减法。
原博客链接
这边写的不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值