原码、反码、补码新解

本文介绍了二进制运算中的原码、反码和补码概念,探讨了如何在没有减法器的计算机CPU中通过加法实现减法。文章以3-2为例,解释了负数在二进制中表示的特殊性,以及负数原码、反码和补码的关系,指出通过补码计算可以避免溢出并正确执行减法操作。

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

世界上有10中人,一种懂二进制,一种不懂二进制。我们习惯了十进制计数,乍看到二进制,有点别扭,认识后慢慢发现它的神奇:有点一生二,二生万物的意思。十进制和二进制的部分对应关系如下:
图一

小范围的十进制运算,我们操练起来麻麻溜溜的,二进制的运算相信你也不差,然,碰到十进制转二进制的运算就有点蒙圈了。

计算机 CPU 的运算器只实现了加法器,没有实现减法器。但,我们可以通过加上一个负数来实现减法运算。

如果你试着将3-2这个十进制运算转换成二进制运算进行计算,你就会发现,简单的翻译式计算结果不对啊,怎么能是-5(有符号数最高位1表示负,反之代表正)?
图二
有朋友或许会嗤笑:应该把负数转换成对应的补码进行计算。相信你也对下面这几个概念耳熟能详。

  • 原码:十进制数直接转二进制数得到的就是原码,简单的对应关系如下:
    图三

  • 一个正数的反码、补码等于它的原码;

  • 一个负数的反码:其原码的符号位不变,其它位取反;

  • 一个负数的补码等于其反码+1。
    图四

负数为什么有这么多弯弯道道?从前面的3-2这个例子中,我们可以看到,简单翻译成原码计算有可能得到错误的结果。我们知道一个限定n位的二进制有符号数,表示的范围是-2n-1~2n-1-1,对于最大值2n-1-1,如果加上1,就会发生溢出(最高位是1,其它位为0,表示的是-2n-1),从最大变成了最小。这给了我们一个提醒,是否可以通过溢位来达到减法的目的?

研究发现,计算机数据的溢出,相当于取模。取模的除数就是数值表示范围的上限减去下限:2n-1-1-(-2n-1) +1=2n-1+1。这是一个步长,你会发现,无论正数或负数加上这个步长溢出后,还是它本身(n+1位置上是1,其它位置为0,n+1为溢出位)。

我们将开始的3-2变换为3-2+2n-1+1,再变换一下顺序得到:3+((2n-1-2)+1)。(2n-1-2)表示如下:
图五
细心的你发现(2n-1-2)就是-2的反码(原码符号位不变,其他位取反),((2n-1-2)+1)就是-2补码(反码+1),显然,3-2等于3+(-2的补码)是合理的。

首先,我们需要了解如何将十进制转换成二进制原码反码补码。 1. **原码**:正数直接表示,负数则最高位为1(对于有符号整数)。 - **95 (十进制)**: 原码 = 000001010101(因为95在8位内,不足8位补0) - **-131 (十进制)**: 原码 = 111110100011 (负数最高位为1) 2. **反码**:对原码取反,然后加1(对于有符号整数)。负数的反码是除符号位外全变1。 - **95 (十进制)**: 反码 = 111110101010 (+95的反码) - **-131 (十进制)**: 反码 = 000001011100 (-131的反码) 3. **补码**:也是对原码取反,然后加1,但对于负数,有一个特殊情况:零的补码等于其本身。 - **95 (十进制)**: 补码 = 111110101010 (+95的补码,无需调整) - **-131 (十进制)**: 补码 = 000001011101 (-131的补码,注意最后一位由1变为0) 4. **浮点数的原码反码补码**: - **0.125 (十进制)**: 由于是小数,通常会采用偏移二进制表示法,即在最高位后面跟上实际值的二进制。0.125 = 1 / 8 = 0.00011001... - 原码 = 000000000000011001000... (保留足够位数) - 反码 = 11111111111110011111100... (先取反再加1) - 补码 = 11111111111110011111100... (小数部分不变,不需要加1) - **-0.875 (十进制)**: 同样是小数,可以将其转化为二进制形式 -0.125 * 8 = -1 = -1000... - 原码 = 100000000000001110000... (带符号,注意最左一位) - 反码 = 01111111111111000111100... (先取反再加1) - 补码 = 01111111111111000111100... (小数部分不变,不需要加1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值