为什么输出总是-1?

时间:2012-06-06 10:24:16

标签: c unsigned signed bit-shift

这是代码:

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

即使我x = -N>>2,它也只会1

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

即使我执行int x = -1>>2,输出也会是1

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

2 个答案:

答案 0 :(得分:3)

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

在您的情况下,您所看到的右移行为是保留标志。

考虑char x = -38;。以下演示了在保留符号时bitshift的工作原理:

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

答案 1 :(得分:1)

我相信如果您使用

,您的代码将会有效
unsigned char x=-1>>2;

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