2012-06-06 89 views
-1

这是代码:为什么输出总是-1?

char x=-1>>2; 
printf("%d",x); 

就算我x = -N>>2它只会给1

x = -1 => 11111111 
x= -1>>2 ==> 00111111 = 3F ?? 

而且即便我做了诠释x = -1>>2输出将1

你能解释一下这个计算是如何进行的吗?

回答

1

我相信,如果你使用

unsigned char x=-1>>2; 

对于有符号数(包括字符)您的代码将工作,右移不追加零。这称为符号位扩展。 C使用2的补码形式来存储负数。对于负数,符号位(MSB)在此操作中填充的形式为1。使用无符号数字将解决问题。

3

负值的右移是实现定义的。

在你的情况下,你所看到的右移的行为是保持符号。

考虑char x = -38;。下面演示的位位移保留标志时是如何工作的:

x  11011010 
x >> 1 11101101 
x >> 2 11110110 
x >> 3 11111011 
etc... 
+0

要变得迂腐,它是正确的*负值的转移*是实现定义的... –

+0

谢谢,我已经修复它。 –