C - 位移不按预期工作

时间:2014-09-20 21:14:31

标签: c bit-manipulation

我正在尝试将最低有效位设置为所有位。例如,copyLSB(6)会产生0x00000000,而copyLSB(5)会产生0xffffffff

这是我的代码:

int copyLSB(int x) {
  int r = x << 31;
  r = x >> 31;
  return r;
}

该程序适用于6和5.但是,当我输入0x80000000时,它失败并返回0xffffffff

大家好,我找到了一种不使用位移的方法,这也适用于有符号数字。

int copyLSB(int x) {                                                                                                   │
        int result = x & 1;                                                                                            │
        return ~(~(x & 0) + result);                                                                                   │
}

1 个答案:

答案 0 :(得分:3)

如果您的0x80000000为32位且使用two's complement,则

int为负数。

否定的左移是未定义的行为。负面的正确转变是实施定义的行为。

来自标准:

  

6.5.7按位移位运算符

     

E1&lt;&lt;&lt; E2 E1 左移 E2 位位置;腾出的位充满了   零。 ....如果 E1 具有带符号类型和非负值,并且 E1×2 ^ E2 在结果类型中可表示,那么这就是结果值;否则,行为未定义。

     

...

     

E1&gt;&gt;的结果E2 E1 右移 E2 位位置。 ...如果 E1 具有签名类型和负值,则结果值是实现定义的。