为什么x或x的补码是-1?

why is the compliment of x or x -1?

我卡在这个基本问题上了:

int x=1;
printf(~x|x) // -1

不应该是~01|01 ~01 = 10 10|01 = 11 =3吗?

好的,看完所有的回复,我的理解是1111=-1在双恭维机上。

我的后续问题是为什么 1111 =-1 而不是 15?

谢谢

让我们假设 8 位整数:

x    : 0000 0001
~x   : 1111 1110

~x|x : 1111 1111 == -1

事实上,无论 x 的值如何,情况总是如此。此操作将所有位设置为 1。由于您的数据类型是有符号的,并且在这种情况下负值使用二进制补码,因此该值将为 -1。

在 C 中,运算符 ~(按位非)的优先级高于 |(按位或)。

sizeof (int) == 4:

 x   = 00000000 00000000 00000000 00000001

~x   = 11111111 11111111 11111111 11111110

~x|x = 11111111 11111111 11111111 11111111

对于补码,11111111 11111111 11111111 11111111 就是 -1

要回答您的后续问题,您可以运行此代码并查看结果:

unsigned int x = 1;
printf("%u", ~x|x);

那你为什么不直接 运行 它在电脑上呢?实际上~先于|,所以我们得到

~x=11111110(supposed 8-bit)

然后我们使用 |,只需更改第一个 bit.So 答案是 -1,所有位都等于 1。