这个问题在这里已有答案:
请查看以下代码并帮助我理解它
int a=1;
int b=~1;
printf("%d",b);
输出是:
-2
所以这说1 =(00000001)当经历〜产生(11111110)时,它是数字2的2的补码,因此-2是答案。所以100总是假定为-4而不是4?
计算机是否总是遵循2的补码方法来表示负数?
没有。
有些计算机使用1的恭维(其中~1 == -0),有些使用“符号和幅度”(其中~1 == -127),有些使用“偏差”(其中有符号值是“无符号值 - 偏差”和其中~1 == 127)。对于整数,现在这些都是相对罕见的。
不常见的是标准(IEEE-754)浮点格式;这是“符号和幅度”(用于有效数字)和“偏见”(用于指数)的光荣组合。
当您已经确定了多少位保存数字时,您只能定义两个补码。在存储位100的地方,你有一个三位有符号整数类型吗?如果是这样,那么100将被解释为-4。
如果将它存储在一个更大的整数类型中,我们通常会假设1左边的其他位都是0(因为否则你应该显示它们是什么)并且值将为正4。
顺便说一句,现在找到一个C或C ++ int
类型的编译器是非常不寻常的,它只有8位长,就像问题中那样。 (好吧,“不寻常”是轻描淡写 - 正如评论所指出的那样,标准不允许这样做,据我所知,从来没有被认为是合法的有一个简单的int
类型,如问题所示存储在少于16位。你可以在struct
中声明一个只有3位的有符号整数位域,但是它的语法与问题显示的完全不同。)所以即使将int b=~1;
解释为也是不正确的存储位模式11111110;实际的位模式至少有16位,而近年来我们大多数人只看到它编译为32位。