c程序导致输出2为什么?

Vik*_*kas 1 c bit-manipulation

#include <stdio.h>
int main()
{
    int x = 0, y = 2;
    int z = ~x & y;
    printf("%d\n", z);
}
Run Code Online (Sandbox Code Playgroud)

任何正文都可以告诉操作如何在内存中保存变量

Adr*_*tti 8

让我用8位简化这个:

x         0   00000000
y         2   00000010
~x       -1   11111111
~x & y    2   00000010

按位补码~将补充(反转值)其操作数的每个位(1变为00变为1).如果它在两个操作数中,则按位与AND &将设置一个位:11

lhs    rhs    lhs AND rhs
 0      0          0   
 0      1          0   
 1      0          0   
 1      1          1   

然后,例如,011b & 001b将导致001b(因为只有LSB 1在两个操作数中).在你的情况下否定x(这是0)你有32位设置,1所以结果将完全取决于y(因为1 AND RHS = RHS,请参见真值表中的最后两行).

重要提示:请注意,您的代码不可移植,根据ANSI C,有符号整数的按位和AND行为是实现定义的(因此在您的实现中有效的可能会在另一个平台/编译器或其他编译器版本上被破坏).