8位二进制补码表示的最小负数是多少?

发布网友 发布时间: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位的变量。对于浮点数,计算机也是这么做的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com