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

标签 c bitwise-operators

我被这个基本问题困扰:

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

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

好的,阅读完所有回复后,我的理解是 1111=-1 在二进制补码机上。

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

谢谢

最佳答案

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

关于c - 为什么x或x的补码是-1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400309/

相关文章:

c - 让我的 C 程序执行 shellcode

c - 如何从矩阵打印行/列/对角线

c - 如何使用掩码获取几位的值

c - 有趣的按位运算

c# - 反转位移运算符/2 的幂

java - 困难的公式

c - for 循环和模运算符

c - 如何将 char *a[] 复制到 char **b?

c - 如何在没有 * 或 - 运算符的情况下否定 C 中的正整数?

c - 虚拟地址到物理地址的段错误