我正在尝试将最低有效位设置为所有位。例如,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); │
}
答案 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 具有签名类型和负值,则结果值是实现定义的。