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

时间:2017-12-25 00:29:36

标签: c++ c

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

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

输出是:

 -2

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

2 个答案:

答案 0 :(得分:2)

  

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

没有

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

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

答案 1 :(得分:0)

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

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

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