已知[x]补=10110111,[y]补=01001010,则[x-y]补的结果是

急求!!!!
2025-06-26 18:22:02
推荐回答(1个)
回答1:

x的补码,最高位是1,说明x是负数,

反码=10110110,原码=01001001,-(1+8+64)=-73;

y的补码,最高位是0,说明y是正数,与原码相同;y=2+8+64=74

x-y=-73-74=-147已经超出了8位能表示的最小负数,这时一般用16位表示,或者直接报溢出。C语言一般是截取后面的8位。

8位能表示的最大正数=01111111=64+32+16+8+4+2+1=127,

最小负数=1000000补=01111111反=10000000,-128

下面的程序演示C语言是如何处理这个问题的:

#include
#include
int main()
{
char a=-73,b=74,c;

c=a-b;

printf("%d\n",c);

system("PAUSE");

return 0;

}

下面是运行结果:

-147=-(1+128+2+16)

原码:00000000,10010011

反码:11111111,01101100

补码:11111111,01101101

截取后8位:01101101=64+32+8+4+1=109

这正是上面程序最后显示的结果。

扩展至16位之后两数补码相减,简单的运算如下:

11111111,10110111

00000000,01001010

-------------------------

11111111,01101101

这是正确的结果。

遇到这种情况,合适的办法,是扩大整数的总位数。一般是按照8位,16位,32位,64位,128位,...,翻倍的方式进行。

有一种说法,计算机为了减少误差,实际计算时是扩展位数,得到结果后截取后面的原来位数赋值给变量。比如,对于8位的整数计算,扩展成16位,计算之后,截取后8位赋值给8位的变量。对于浮点数,计算机也是这么做的。