分享好友 天南地北首页 网站导航

关于二进制负数的补码

网友发布 2023-07-23 11:22 · 头闻号仪器机械

求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。

同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。

例子:求-5的补码,过程如下:-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011),所以-5的补码是11111011。数0的补码表示是唯一的。

[+0]补=[+0]反=[+0]原=00000000;[-0]补=11111111+1=00000000。

扩展资料:

补码系统的最大优点可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便。

另外,补码系统的0就只有一个表示方式,这和反码系统不同(在反码系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。在n比特的补码加减法中,忽略第n+1个比特的作法在各种有号数加法下都适用(不过在判断是否溢出(overflow)时,仍然会用到第n+1个比特)。

因此在补码的系统,加法电路就可以处理有负数的加法,不需另外处理减法的电路。而且,只要有电路负责数字的变号(例如将1变换为-1),也可以用加法电路来处理减法。而数字的变号就用计算数字的补码来完成。

百度百科——补码

原文地址戳这里

补码表示是数值计算中的一个基本技术,它使得减法操作可以用加法操作来替换。

补码表示是数字计算机表示有符号整数的一种方式。补码表示的主要目的是用加法操作来代替减法操作。通过这种方式,我们可以用同样的电路来处理加法和减法。因此,可以减少门电路的数目,从而减少整个电路系统的大小,能耗。事实上,如果不使用补码表示,我们只能用一种类似平时手算十进制数的方式,这需要两种不同的门电路块来计算加法和减法。此外,在计算之前,还需要一些执行逻辑判断。

当M足够大时,可得:

所以等式1可以写成:

等式3需要一个加法操作和一个减法操作。另外,为了计算B,还需要一个减法操作。看上去把运算变得更加复杂了,因为 只需要一个减法操作,而等式3需要一个加法操作,两个减法操作。但是,等式3计算需要的两个减法都是减去同样的常数M, 我们是否能找到一个合适的M,来简化等式2和等式3中的减法操作。如果可以,就能用等式3达到用加法实现减法的目的。所以问题变成:常数M的合适值是多少?在后文会被证明,对于k比特的数,

假设一个4比特无符号数b, 测试减法 .

,所以 。

为了简化运算,可以把M写成 ,代入等式2:

可以很简单地计算 ,因为事实上是对b按位取反。假设 ,则

可以看出,括号里的减法其实是b按位求补。因此,要算 ,只需要对b按位求补再加上 . 在后文会提到,从实现的角度,对一个数的按位求补加上 是很简单的

得到B之后,可以用加法器计算等式3中的a+B。为了得到最后的结果,还需要把a+B的结果减去M。在上面的例子中,我们考虑的是4比特的无符号数,因此,S能取得最大值时,应该是 和 ,得到 . 所以4比特是足够表示4比特减法的。选择 ,加上M或者减去M,只能影响第5位比特的值。所以, ,第5位比特值改变第一次。接着, ,第5位比特值改变第二次。因为是二进制,则第5位比特值没有改变,所以当计算 时,只需要丢弃 的第5位比特值即可。事实上,这等价于对 作模M运算,限制 的值小于等于M-1

上述讨论总结为:如果a和b是两个k比特的无符号数,则a-b等价于计算a加上M-b,然后丢弃第k+1位比特值。在这里M等于

在模M运算中,M-b被称为b的补码(two's complement). 一个数的补码可以通过对这个数按位求补再加1得到。

因为是4比特数,所以 。根据上述理论,先求

再把a加上B,

再丢弃第5位比特值,得到

因为是5比特数,所以 。根据上述理论,用M-b表示-b,先求

再把a加上B,

再丢弃第6位比特值,得到

将b和M-b相加得到M,而M在模为M的运算中等于0;这也是为什么在模为M的运算中,M-b可以看做是b的补码。在表格1的第二列给出了所有3个比特位的可能组合。相对应的十进制数值放在第一列。假设 ,对应的补码放在第三列。可以发现,在模为M的运算中,第二列加第三列的值等于0. 表格展示出,一个3比特位的数值可以有两种不同的解释。比如,010可以是解析成正十进制数2,或者负十进制数-6.为了区分这两种情况,我们在最左边增加一个额外的符号位,用来区分数值是正数还是负数。

当符号位为0,表示该数为正数。在此示例中,剩下的3个比特位根据上表的第一列给出对应的十进制的大小。比如, ,表示+2. 当符号位1,表示该数为负数,必须要使用上表的第三列来解析。比如, 应解析成-6. 事实上,我们使用4比特位来表示一个有符号的大小为3比特位的数。

现在让我们加上符号位,并实验所有可能的组合。图一展示了4比特位数值的所有可能的组合。如果设定这些数为无符号数,则我们得到圆圈外面的数值。如,无符号数 等于十进制数10. 如果设定这些数为有符号数,则我们得到圆圈里面的数值。如,无符号数 等于十进制数-3.

从图1可以看出,补码常数M 为 。比如,一个负数-5,表示为 . 所有的负数的符号位都为1,当我们处理有符号数时,这个有助于我们在系统里判断负数。

图1也展示了有符号数和无符号数的数值表示范围。用无符号数表示,4比特位可以表示 ~ 的数值范围。用有符号数表示,4比特位可以表示 ~ 的数值范围. 需要注意有符号补码表示的范围的非对称性。该特性可能会导致数值溢出,程序员需要谨慎地处理去避免这种情况发生。

小节总结:当我们假设一个有符号的补码表示,首先要关注符号位。 如果符号位为0,可以像无符号数一样处理得到十进制数值。如果符号位为1, 相关的十进制数值是该补码表示的补码。如 , 按位求补得 ,再加1,得 即3. 所以 表示-3。

因为a的符号位为0,是正数,所以

因为b的符号位为1,是负数,所以

现在,我们熟悉了有符号的补码表示,可以更简单地实现加法和减法。

为了计算a-b,需要找到-b,去加上a.

遂,

,

由于是5比特位的运算,所以丢弃第6位,得到

为了计算a-b,需要找到-b,去加上a.

遂,

,

由于是5比特位的运算,所以丢弃第6位,得到

将结果转换为十进制,

在上述两个例子中,我们丢弃了第6比特位的数值,但结果是正确的,因为补码表示是基于模M运算的。

为了计算a-b,需要找到-b,去加上a.

遂,

,

由于是5比特位的运算,所以丢弃第6位,得到

然而,实际上 . 这是因为5比特位最大能表示的正数是 . 这个例子说明我们总是需要检查计算的结果去保证没有数值上溢发生,从而保证计算结果是正确的。数值上溢发生在,两个正数相加导致结果为负数,还有两个负数相加导致结果为正数。由于补码的性质,一个正数和一个负数相加不会引起数值上溢。

当标志位sub/add为0, Selective complement不执行 , y=b, , 因此结果为a+b+ 。

当标志位sub/add为1, Selective complement执行,对b按位取补 , , ,结果为 。按上文所说 等于y的补码。所以加法器的最后输出的其实是x-y

免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报

举报
反对 0
打赏 0
更多相关文章

收藏

点赞