请查看以下代码并帮助我理解
int a=1;
int b=~1;
printf("%d",b);
输出是:
-2
所以这说1 =(00000001)当经历〜产生(11111110)时,它是数字2的2的补数,因此-2是答案。 那么100总是假定为-4而不是4?
答案 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位。