发布网友 发布时间:2024-09-27 15:16
共1个回答
热心网友 时间:2024-10-08 01:52
x的补码,最高位是1,说明x是负数,
反码=10110110,原码=01001001,-(1+8+)=-73;
y的补码,最高位是0,说明y是正数,与原码相同;y=2+8+=74
x-y=-73-74=-147已经超出了8位能表示的最小负数,这时一般用16位表示,或者直接报溢出。C语言一般是截取后面的8位。
8位能表示的最大正数=01111111=+32+16+8+4+2+1=127,
最小负数=1000000补=01111111反=10000000,-128
下面的程序演示C语言是如何处理这个问题的:
#include <stdio.h>
#include <stdlib.h>
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=+32+8+4+1=109
这正是上面程序最后显示的结果。
扩展至16位之后两数补码相减,简单的运算如下:
11111111,10110111
00000000,01001010
-------------------------
11111111,01101101
这是正确的结果。
遇到这种情况,合适的办法,是扩大整数的总位数。一般是按照8位,16位,32位,位,128位,...,翻倍的方式进行。
有一种说法,计算机为了减少误差,实际计算时是扩展位数,得到结果后截取后面的原来位数赋值给变量。比如,对于8位的整数计算,扩展成16位,计算之后,截取后8位赋值给8位的变量。对于浮点数,计算机也是这么做的。