为什么是x或x -1的恭维?

时间:2016-02-15 01:45:12

标签: c bitwise-operators

我坚持这个基本问题:

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

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

好的,在阅读完所有回复后,我的理解是1111=-1在两台赞美机器上。

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

由于

3 个答案:

答案 0 :(得分:1)

让我们假设8位整数:

x    : 0000 0001
~x   : 1111 1110

~x|x : 1111 1111 == -1

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

答案 1 :(得分:1)

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

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);

答案 2 :(得分:0)

那你为什么不在计算机上运行呢?实际上~|之前,所以我们得到了

~x=11111110(supposed 8-bit)

然后我们使用|,只需更改第一位。所以答案是-1,它将所有位等于1。