c解释中的按位运算

lou*_*bas 0 c bit-manipulation

我在c中有以下代码:

 unsigned int a = 60; /* 60 = 0011 1100 */
 int c = 0;
 c = ~a; /*-61 = 1100 0011 */
 printf("c = ~a = %d\n", c );
 c = a << 2; /* 240 = 1111 0000 */
 printf("c = a << 2 = %d\n", c );
Run Code Online (Sandbox Code Playgroud)

第一个输出是-61而第二个输出是240.为什么第一个printf会计算1100的两个补码,而第二个只是将1111 0000转换为十进制的等值?

pad*_*ddy 6

您假设a int只有8位宽.您的系统可能不是这种情况,可能使用16位或32位int.

在第一个例子中,所有位都被反转.这实际上是一个直接的反转,而不是两个补充:

1111 1111 1111 1111 1111 1111 1100 0011  (32-bit)
                    1111 1111 1100 0011  (16-bit)
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,当您将其向左移动2时,最高位仍然为零.您通过在评论中将数字描述为8位来误导自己.

0000 0000 0000 0000 0000 0000 1111 0000  (32-bit)
                    0000 0000 1111 0000  (16-bit)
Run Code Online (Sandbox Code Playgroud)

  • 不仅适用于旧系统.在当今的大多数8位和16位系统中,它仍然是16位,例如在许多μC上. (3认同)