C 为什么从9位模式100000000中减去一个负8位值会得到幅值?

C 为什么从9位模式100000000中减去一个负8位值会得到幅值?,c,twos-complement,C,Twos Complement,我的教科书对有符号整数的两种补码方法作了如下解释: 我们将讨论此方法,因为它适用于1字节值。因为 上下文中,值0到127由最后7位表示, 将高阶位设置为0。到目前为止,这与 符号幅度法。此外,如果高阶位为1,则该值为 消极的不同之处在于确定其价值 负数。减去位模式 对于9位模式100000000(256 as)中的负数 以二进制表示),以及 结果是该值的大小 这些对我来说毫无意义。典型的处理器使用八位字节(8位字节)。从9位字节中减去8位字节意味着什么 我完全被这个解释弄糊涂了,如果有人能更清楚

我的教科书对有符号整数的两种补码方法作了如下解释:

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

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


我完全被这个解释弄糊涂了,如果有人能更清楚地解释这个概念,我将不胜感激。

基本上,为了高效的计算,您希望以相同的方式执行相同的运算(加法、减法等),而不管符号是什么。首先,考虑无符号字节的情况。

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

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


一切正常。在我们的新表示中,-128是127+1,这是011111+1,这是10000000-1将是11111。希望我有所帮助。

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

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

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


一切正常。在我们的新表示中,-128是127+1,这是011111+1,这是10000000-1将是11111。我希望我能帮上忙。

我对两个补码的记忆是:

“翻转位加一”

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

int i, j= 127;
i = (~j)+1;
printf ("%d\n",i); // prints -127

我对二的补语的记忆是:

“翻转位加一”

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

int i, j= 127;
i = (~j)+1;
printf ("%d\n",i); // prints -127
您有1个字节(8位数字,每个数字为0或1)

2的补码通过看第一个数字起作用

10010011
^ this one
如果是0,则数字为正数,您可以继续正常地将二进制转换为十进制

如果它是1,那么它是负数。正常转换(
bin(10010011)=147
),然后减去256(
147-256=-109
),这是2的补码。

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

2的补码通过看第一个数字起作用

10010011
^ this one
如果是0,则数字为正数,您可以继续正常地将二进制转换为十进制


如果它是1,那么它是负数。正常地转换它(
bin(10010011)=147
),然后减去256(
147-256=-109
),这就是你的2的补码。

还有很多信息,但这与C无关。双补法的思想是能够根据第一位写入有符号数。例如,如果您的字节是11111111,则表示它是负数;相反,如果它是01111111,则表示它是正数。在上面@user3386109提供的链接上阅读更多关于这个词的信息,他们的意思是“减法”这个词在数学中的正常定义。。。不知道你对什么感到困惑。例如,256-251=5,所以二的补码中的-5与+251表示相同,这只是普通的算术运算。从9位值中减去8位值的结果将再次适合8位。是的,理解和是第一步。还有很多信息,但这与C无关。双补法的思想是能够根据第一位写入有符号数。例如,如果您的字节是11111111,则表示它是负数;相反,如果它是01111111,则表示它是正数。在上面@user3386109提供的链接上阅读更多关于这个词的信息,他们的意思是“减法”这个词在数学中的正常定义。。。不知道你对什么感到困惑。例如,256-251=5,所以二的补码中的-5与+251表示相同,这只是普通的算术运算。从9位值中减去8位值的结果将再次适合8位。是的,理解和是第一步。这更有意义。我的书给出了以下例子:100000000−10000000 = 10000000. “不过,这在数学上是错误的。”指针很高兴我能帮上忙。如果你认为这是一个答案,那么继续前进,点击绿色复选标记;指针——它在数学上不是错误的;这是二进制减法。@DavidBowling这一定是我的误解所在。谢谢,大卫。这更有意义。我的书给出了以下例子:100000000−10000000 = 10000000. “不过,这在数学上是错误的。”指针很高兴我能帮上忙。如果你认为这是一个答案,那么继续前进,点击绿色复选标记;指针——它在数学上不是错误的;这是二进制减法。@DavidBowling这一定是我的误解所在。谢谢,大卫。