计算机是否总是遵循2的补码方法来表示负数? [重复]

问题描述 投票:4回答:2

请查看以下代码并帮助我理解它

int a=1;
int b=~1;
printf("%d",b);

输出是:

 -2

所以这说1 =(00000001)当经历〜产生(11111110)时,它是数字2的2的补码,因此-2是答案。所以100总是假定为-4而不是4?

c++ c
2个回答
2
投票

计算机是否总是遵循2的补码方法来表示负数?

没有。

有些计算机使用1的恭维(其中~1 == -0),有些使用“符号和幅度”(其中~1 == -127),有些使用“偏差”(其中有符号值是“无符号值 - 偏差”和其中~1 == 127)。对于整数,现在这些都是相对罕见的。

不常见的是标准(IEEE-754)浮点格式;这是“符号和幅度”(用于有效数字)和“偏见”(用于指数)的光荣组合。


0
投票

当您已经确定了多少位保存数字时,您只能定义两个补码。在存储位100的地方,你有一个三位有符号整数类型吗?如果是这样,那么100将被解释为-4。

如果将它存储在一个更大的整数类型中,我们通常会假设1左边的其他位都是0(因为否则你应该显示它们是什么)并且值将为正4。

顺便说一句,现在找到一个C或C ++ int类型的编译器是非常不寻常的,它只有8位长,就像问题中那样。 (好吧,“不寻常”是轻描淡写 - 正如评论所指出的那样,标准不允许这样做,据我所知,从来没有被认为是合法的有一个简单的int类型,如问题所示存储在少于16位。你可以在struct中声明一个只有3位的有符号整数位域,但是它的语法与问题显示的完全不同。)所以即使将int b=~1;解释为也是不正确的存储位模式11111110;实际的位模式至少有16位,而近年来我们大多数人只看到它编译为32位。

© www.soinside.com 2019 - 2024. All rights reserved.