【问题标题】:Why the output is always -1?为什么输出总是-1?
【发布时间】:2012-06-06 10:24:15
【问题描述】:

这是代码:

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

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

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

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

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

【问题讨论】:

    标签: c unsigned signed bit-shift


    【解决方案1】:

    负值右移由实现定义。

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

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

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

    【讨论】:

    • 为了迂腐,实现定义的是负值的右移...
    【解决方案2】:

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

    unsigned char x=-1>>2;
    

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

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2020-06-26
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      相关资源
      最近更新 更多