这是代码:为什么输出总是-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?
char x=-1>>2;
printf("%d",x);
就算我x = -N>>2
它只会给1
。
x = -1 => 11111111
x= -1>>2 ==> 00111111 = 3F ??
而且即便我做了诠释x = -1>>2
输出将1
。
你能解释一下这个计算是如何进行的吗?
我相信,如果你使用
unsigned char x=-1>>2;
对于有符号数(包括字符)您的代码将工作,右移不追加零。这称为符号位扩展。 C使用2的补码形式来存储负数。对于负数,符号位(MSB)在此操作中填充的形式为1。使用无符号数字将解决问题。
负值的右移是实现定义的。
在你的情况下,你所看到的右移的行为是保持符号。
考虑char x = -38;
。下面演示的位位移保留标志时是如何工作的:
x 11011010
x >> 1 11101101
x >> 2 11110110
x >> 3 11111011
etc...
要变得迂腐,它是正确的*负值的转移*是实现定义的... –
谢谢,我已经修复它。 –