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转换为十进制的等值?
您假设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)