代码之家  ›  专栏  ›  技术社区  ›  James Raitsev

逻辑、算术位移位

  •  9
  • James Raitsev  · 技术社区  · 14 年前

    1. << 两者都一样
    2. >> 移位的不同之处在于,逻辑移位总是用0填充字节,而算术移位则用符号位填充字节。

    如何用C来区分这一点?

    << , >>

    命令与以下命令有何不同:

    int i=1;
    printf ("%d\n", i >> 1); // logical shift
    
    int j=1;
    printf ("%d\n", j >> 1); // arithmetical shift
    

    1 回复  |  直到 7 年前
        1
  •  15
  •   kennytm    14 年前

    对于非负数,两种右移是相同的。只有要移位的数字为负数时,才会出现差异。

    实际上C标准没有规定什么时候应该 >> 当数字为负数时执行逻辑或算术移位,但通常执行算术移位。要执行逻辑移位,必须将数字转换为相应的无符号类型, for example

    int x = -2;
    int y = x >> 1;    // arithmetic shift.
    assert (y == -1);
    int z = (unsigned)x >> 1;  // logical shift.
    assert (z == 0x7FFFFFFF);