-1

这是代码:

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

即使我这样做x = -N>>2,它只会给1

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

即使我做 intx = -1>>2输出也会是1.

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

4

2 回答 2

3

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

在您的情况下,您看到的右移行为是保留符号。

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

x       11011010
x >> 1  11101101
x >> 2  11110110
x >> 3  11111011
etc...
于 2012-06-06T10:28:56.087 回答
1

我相信如果你使用你的代码会起作用

unsigned char x=-1>>2;

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

于 2012-06-06T10:58:16.127 回答