为什么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。
我卡在这个基本问题上了:
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。