【问题标题】:Can not understand the right shift operators operation in c for negative numbers [duplicate]无法理解c中负数的右移运算符操作[重复]
【发布时间】:2016-10-30 20:30:41
【问题描述】:

我有这段简单的代码。 谁能解释为什么输出是ffff 而不是0fff??

#include<stdio.h>

int main(){

   printf("\n%x",(-1>>4));

   return 1;
}

【问题讨论】:

    标签: c bitwise-operators


    【解决方案1】:

    最好避免移动负数。对于&lt;&lt;,这是未定义的行为。对于&gt;&gt;,它是实现定义的:

    E1 &gt;&gt; E2 的结果是E1 右移了E2 位位置。如果E1 具有无符号类型 或者如果E1 具有带符号类型和非负值,则结果的值是整数 E1 / 2E2 商的一部分。 如果E1 具有带符号类型和负值,则 结果值是实现定义的

    【讨论】:

    • 我能再详细一点吗?
    • 不知道右移中的负数是要除以 16 还是在顶部滚动 0 位。
    • @AsifAhmed 解释了未定义和实现定义的行为,例如here。粗略地说,您应该检查编译器的文档。但无论如何,尽量避免转移带符号的否定词。
    【解决方案2】:

    右移用符号位填充空位。也就是说,如果数字为正,则填充为 0,如果为负,则填充为 1。

    -1 = ffff = 11111111

    如果你把它移到右边,得到的数字将是一样的。

    如果您不明白为什么 -1 = ffff,请阅读二进制补码,这是大多数语言使用的有符号整数的表示。

    【讨论】:

    • "右移用符号位填充空位。" 实践中是典型情况,但不能保证。
    • 我现在明白了。我知道在移位时,位仅被零替换。不知道它在右移期间被符号位值替换。谢谢你 。 . @AlexD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多