C解释中的按位运算

卢巴斯

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

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

稻田

您假设anint仅为8位宽。在您的系统上可能不是这种情况,系统可能使用16位或32位int

在第一个示例中,所有位都被反转。这实际上是一个直接的求逆,而不是二进制补码:

1111 1111 1111 1111 1111 1111 1100 0011  (32-bit)
                    1111 1111 1100 0011  (16-bit)

在第二个示例中,当您将其左移2时,最高位仍为零。您通过在注释中将数字描述为8位来误导了自己。

0000 0000 0000 0000 0000 0000 1111 0000  (32-bit)
                    0000 0000 1111 0000  (16-bit)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章