我在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] 删除。
我来说两句