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

ani*_*ime 5 c c++

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

int a=1;
int b=~1;
printf("%d",b);
Run Code Online (Sandbox Code Playgroud)

输出是:

 -2
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*d K 0

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

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

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