我正在学习C中的逐位运算符。当我计算~4的结果时,我得到11,当我在网站上计算时,我也得到相同的结果。但我的编译器给了我错误的结果,每次编译时我都得到5。我认为我的编译器设置是错误的。我在网上搜索了一下这个问题,但什么也没找到。
我能做些什么来解决这个问题?
int x = ~4;
printf("%dn", x);
您没有考虑到数据类型具有一定的大小,该大小是独立于其内容而固定的。
在大多数现代系统上,int
具有32位。这意味着您的4
表示为
00000000 00000000 00000000 00000100
当你做~
时,你会得到
11111111 11111111 11111111 11111011
。
由于int
是一种有符号的数据类型,并且(在大多数现代系统上)2的补码用于表示负值,因此显示为-5
。
正确答案应该是-5。
4 = 00000000 00000000 00000000 00000100
~4 = 11111111 11111111 11111111 11111011
这是-5的二进制表示,使用32位有符号整数。对于有符号整数,~x=-x-1
。
这可能是向您展示的最简单方法
#include <stdio.h>
int main() {
printf("%on", 4);
printf("%o %dn", ~4, ~4);
printf("%o %dn", 4 + ~4, 4 + ~4);
return 0;
}
将显示:
4
37777777773 -5
37777777777 -1
如果你在八进制编码的最后一个八进制3上加上4,你就会得到7,因此补码是按预期应用的。为什么第二个数字看起来如此奇怪,那是因为它被编码为两个互补数字。