补码的相关计算

本文详细介绍了二进制补码的计算方法,包括原码、反码和补码的概念,并扩展到十进制补码的计算。重点讲解了如何从补码求原码,以及实例演示了Python中计算负数补码的方法。理解这些有助于在编程和计算机系统中正确处理数值运算。
摘要由CSDN通过智能技术生成

补码的计算方法

1、二进制补码的计算方法

二进制的补码计算非常简单,各种教材中也经常使用二进制来说明源码、反码与补码三者的关系,掌握一定基础的人都知道一下规则:

1.1 原码

最高位为符号位,0表示正数,1表示负数。

例如:
X = 0b11 (3),四比特表示原码 = 0011(3) ;

X = - 0b11(-3) ,四比特表示原码 = 1011(11) ;

1.2 反码

最高位为符号位,0表示正数,1表示负数。

正数的反码等于本身,负数的反码除符号位外,各位取反:

例如:
X = 0b11 (3),四比特表示原码 = 0011(3),对应反码为 = 0011(3) ;

X = - 0b11(-3) ,四比特表示原码 = 1011(11),对应反码为 = 1100(12)  ;

1.3 补码

最高位为符号位,0表示正数,1表示负数。

正数的补码等于本身,负数的补码等于反码+1:

例如:
X = 0b11 (3),四比特表示原码 = 0011(3),对应反码为 = 0011(3) ,补码为 = 0011(3);

X = - 0b11(-3) ,四比特表示原码 = 1011(11),对应反码为 = 1100(12),补码为1101(13)  ;

2、十进制的补码计算方法

对于十进制数来说,通过前面的性质不难得到正十进制数补码等于其本身,对于负十进制数来说如果还按位进行运算就太麻烦了!为了讲明白,我们从补码的起因说起:

“反码加一”只是补码所具有的一个性质,不能被定义成补码。负数的补码,是能够和其相反数相加通过溢出从而使计算机内计算结果变为0的二进制码。这是补码设计的初衷,具体目标就是让1+(-1)=0,这利用原码是无法得到的:
0001 ( 1 ) + 1001 ( − 1 ) = 1010 ( − 2 ) 0001(1)+1001(-1)=1010(-2) 0001(1)+1001(1)=1010(2)
而在补码中:
0001 ( 1 补 ) + 1110 ( − 1 补 ) = 10000 ( 1 溢 出 ) 0001(1补)+1110(-1补)=1 0000(1溢出) 00011+11101=10000(1)
所以对于一个n位的负数-X,有如下关系:
X 补 + ( − X ) 补 = 1 00 ⋅ ⋅ ⋅ 0 ⏟ n = 2 n X_补+(-X)_补=1 \underbrace{00···0}_n=2^n X+(X)=1n 000=2n
所以假设寄存器是n位的,那么-X的补码,应该是 2 n − X 2^n-X 2nX的二进制编码。

例如前面举得例子:

例如:
X = - 0b11(-3) ,四比特表示原码 = 1011(11),对应反码为 = 1100(12),补码为1101(13)  ;

如果寄存器4位,-3对应的补码二进制数为13,刚好是 2 4 − 3 2^4-3 243

正十进制数补码等于其本身,n位寄存器下-X的补码等于 2 n − X 2^n-X 2nX对应的二进制编码。

如果使用python的话,可以使用&来快速获取补码:

-3&0xf
Out[1]: 13
    
5&0xf
Out[2]: 5

这里的0xf指的是0b1111,表示4位的寄存器。如果是7位寄存器,0b111111就是0x3f。

3、已知补码怎么求原码?

对于正数来说,根据前面的介绍很容易知道 原码=补码=反码,接下来主要讨论给定负数的补码怎么求负数的原码:

3.1 二进制

先说结论:补码的补码就是原码。下面开始证明:

已知二进制的补码为 X 补 X_补 X,根据1.3中求补码的过程易得
X = ( X 补 − 1 ) 反 X=(X_补-1)_反 X=(X1)
事实上上式还等价于:
X = ( X 补 ) 反 + 1 X=(X_补)_反+1 X=(X)+1

可以简单证明一下,根据反码实际的求解过程可以得到下面式子:
a + a 反 = 0 b 11 ⋅ ⋅ ⋅ 1 ⏟ n = 2 n + 1 − 1 = F a+a_反=0b \underbrace{11···1}_n=2^{n+1}-1=F a+a=0bn 111=2n+11=F

a 反 + 1 = F − a + 1 a_反+1=F-a+1 a+1=Fa+1

当a=a-1时有:
( a − 1 ) 反 = F − ( a − 1 ) (a-1)_反=F-(a-1) (a1)=F(a1)

上面两式子说明了:

( a − 1 ) 反 = a 反 + 1 (a-1)_反=a_反+1 (a1)=a+1
用文字描述即:取反加一等价于减一取反!

所以二进制补码有如下关系:
X = ( X 补 − 1 ) 反 = ( X 补 ) 反 + 1 = ( X 补 ) 补 X=(X_补-1)_反=(X_补)_反+1=(X_补)_补 X=(X1)=(X)+1=(X)
也就是说补码的补码就是原码,有点负负得正的意思哦。

3.1 十进制

n位寄存器下-X的补码等于 2 n − X 2^n-X 2nX对应的二进制编码。

(1)十进制的情况下,如果给的补码是无符号数 2 n − X 2^n-X 2nX,那么原码即 ( 2 n − X ) − 2 n = − X (2^n-X)-2^n=-X (2nX)2n=X即可。

例如前面-3补码无符号数是13,对应的原码就是 13 − 2 4 = − 3 13-2^4=-3 1324=3

(2)十进制的情况下,如果给的补码是有符号数-Y,对应的无符号数就是 2 n − 1 + Y 2^{n-1}+Y 2n1+Y,那么原码就是 ( 2 n − 1 + Y ) − 2 n = Y − 2 n − 1 (2^{n-1}+Y)-2^n=Y-2^{n-1} (2n1+Y)2n=Y2n1

例如前面-3补码有符号数是-5,对应的原码就是 5 − 2 3 = − 3 5-2^3=-3 523=3

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算机中,原码、反码、补码和移码都是用来表示带符号的二进制数的编码方式。原码是最直观的表示方式,即符号位加上数值部分的二进制表示。而反码则是在原码的基础上,符号位不变,其他位按位取反。补码是在反码的基础上,末位再加1。移码则是将符号位取反。 在计算机中,实际上只有加法运算,减法运算也要转换为加法运算,乘法转换为加法运算,除法转换为减法运算。因此,在计算机中,对任意一个带有符号的二进制数,都是按其补码的形式进行运算和存储的。补码的使用简化了运算规则,并且将减法运算转换为加法运算补码加法公式为[X Y补 = [X补 + [Y补,补码减法公式为[X-Y补 = [X补 - [Y补 = [X补 + [-Y补,其中[-Y补为负补,求负补的方法是对补码的每一位(包括符号位)取反,然后末位加1。 已知补码,如果符号位为0,则表示是一个正数,补码即为该数的原码。如果符号位为1,则表示是一个负数,求原码的操作是将符号位保持为1,其余各位取反,然后整个数加1。 综上所述,原码、反码、补码和移码是用来表示带符号的二进制数的编码方式,补码计算机中广泛应用,简化了运算规则,并且方便进行加法和减法运算。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [原码、反码、补码、移码及其运算](https://blog.csdn.net/Chenweidalao/article/details/107582993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [原码,反码,补码和移码的相关概念](https://blog.csdn.net/lilongfei123321/article/details/84298927)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值