为什么从9位模式100000000中减去负8位值会给出幅度?

时间:2016-11-07 22:17:54

标签: c twos-complement

我的教科书为有符号整数的双补码方法提供了以下解释:

  

我们将讨论此方法,因为它适用于1字节值。在那里面   上下文,值0到127由最后7位表示,   将高位设置为0.到目前为止,这与   符号量法。此外,如果高位为1,则值为   负。不同之处在于确定其价值   负数。减去位模式   对于9位模式100000000的负数(256为   以二进制表示),和   结果就是价值的大小。

这些对我来说都没有任何意义。典型的处理器使用八位字节(8位字节)。从9位字节中减去8位字节意味着什么?

我对这个解释感到非常困惑,如果有人能够更清楚地解释这个概念,我会非常感激。

3 个答案:

答案 0 :(得分:2)

基本上,为了有效计算,您希望以相同的方式执行相同的操作(加法,减法等),而不管符号如何。首先,考虑无符号字节的情况。

使用8位,您可以表示0-255之间的任何值。加法和减法的工作方式与通常相同(模256),一切都很好。

现在,想象一下当你在127时,递增1会给你-128。我们仍在计算256的模数,但前128个数字已经移动了256个。现在,我们来看看加法: 10 +( - 5)= 10 + 251(无符号)= 261 = 5(模255)。

一切都按预期工作。所以,在我们的新表示中,-128是127 + 1,这是01111111 + 1,即10000000.-1将是11111111.我希望我帮助过。

答案 1 :(得分:1)

您有1个字节(8位数字,每个数字为0或1)

通过查看第一个数字

来实现2&#39的补充
10010011
^ this one

如果它为0,则数字为正,您可以继续正常将二进制转换为十进制。

如果它是1,那么它是否定的。正常转换(bin(10010011) = 147)和THEN减去256(147 - 256 = -109),并且有2的补码。

答案 2 :(得分:0)

我对两个补充的记忆说:

  

"翻转位加一个"

事实上,以下数字为负数:

Before +=