这是代码:
char x=-1>>2;
printf("%d",x);
即使我这样做x = -N>>2
,它只会给1
。
x = -1 => 11111111
x= -1>>2 ==> 00111111 = 3F ??
即使我做 intx = -1>>2
输出也会是1
.
你能解释一下这个计算是如何进行的吗?
负值的右移是实现定义的。
在您的情况下,您看到的右移行为是保留符号。
考虑char x = -38;
。下面演示了在保留符号时位移是如何工作的:
x 11011010
x >> 1 11101101
x >> 2 11110110
x >> 3 11111011
etc...
我相信如果你使用你的代码会起作用
unsigned char x=-1>>2;
对于有符号数(包括字符),右移不附加零。这称为符号位扩展。C 使用 2 的补码形式来存储负数。对于负数,符号位 (MSB) 以这种形式为 1,在操作期间被填充。使用无符号数字将解决此问题。