C 为什么产出会有这样的价值?

C 为什么产出会有这样的价值?,c,bitwise-operators,C,Bitwise Operators,有人能解释一下这个代码段是如何将输出结果从27改为23的吗。我可能对逐位运算不太了解 #include <stdio.h> int main() { int a = 20, b = 7; printf("%d%",a|b); } 因为在二进制中,20是10100,7是00111 所以你有: 10100 00111 | ----- 10111 这是23的二进制表示,而不是27 PS:|是按位or运算符,因此,如果至少一个操作数为1,则为1,否则为0。您需要首先了解位级别的

有人能解释一下这个代码段是如何将输出结果从27改为23的吗。我可能对逐位运算不太了解

#include <stdio.h>

int main()
{
  int a = 20, b = 7;
  printf("%d%",a|b);
}

因为在二进制中,20是10100,7是00111

所以你有:

10100
00111 |
-----
10111
这是23的二进制表示,而不是27


PS:|是按位or运算符,因此,如果至少一个操作数为1,则为1,否则为0。

您需要首先了解位级别的操作方式或工作方式,有关各种按位运算符的详细信息,请参阅:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
请注意最后一行,1 | 1与1+1不同

因此,由于多位值或多位值的结果只涉及对这些值中的每个对应位进行运算,因此表达式a | b只有在两个值没有共用一个位的情况下才等于a+b

对于您的价值观,它们确实共享一点:

              +-shared one-bit--+
              |                 |
              V                 V
    20 = 16 + 4         = 0001 0100
     7 =      4 + 2 + 1 = 0000 0111 
                          ---- ----
20 | 7                  = 0001 0111 = 16 + 4 + 2 + 1 = 23

这就解释了你得到的值以及为什么它与20+7不同。

为什么它会打印2720是0000100,7是00000111。|如果至少一个操作数的对应位为1,则表示结果中的位为1。20 | 7显然是00010111,即16+7。您可以在程序员模式下使用windows计算器。这将使你避免类似的问题。为什么程序员不能区分圣诞节和万圣节?因为12月25日=10月31日。请尝试打印%o,a | b;