这是代码:
char x=-1>>2;
printf("%d",x);
即使我x = -N>>2
,它也只会1
。
x = -1 => 11111111
x= -1>>2 ==> 00111111 = 3F ??
即使我执行int x = -1>>2
,输出也会是1
。
你能解释一下这个计算是如何进行的吗?
答案 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,在操作期间填充。使用无符号数字将解决问题。