【发布时间】:2017-01-18 05:56:29
【问题描述】:
我以为这个世界可以正常工作,但事实并非如此:
int a = -500;
a = a << 1;
a = (unsigned int)a >> 1;
//printf("%d",a) gives me "2147483148"
我的想法是左移会删除最左边的符号位,因此将其右移为无符号整数将保证它是逻辑移位而不是算术移位。为什么这是不正确的?
还有:
int a = -500;
a = a << 1;
//printf("%d",a) gives me "-1000"
【问题讨论】:
-
它确实有效,它将符号设置为 0。但也许不是你想要的方式。如果你想用 bitmath 来实现
abs,那就比这更棘手了。 -
很公平,对 MIN_INT 使用标准
abs有点危险。不是天生的,而是溢出和 UB yada yada.. 你可以只做一个未签名的abs,例如if (x < 0) return -(unsigned)x; else return (unsigned)x; -
在 C 和 C++ 中,
a << 1表示“乘以 2”,而不是“将底层位表示中的位左移 1”。 -
因为您要求更改
SIGN位(x86 asm 操作码:NOT)而不是将负数转换为正数(x86 asm 操作码:NEG)。这是两个不同的东西。下面的答案解释了这一点并且是正确的。 -
@Hurkyl 有区别吗?无论如何,如果有,它在这里不可见
标签: c bit-manipulation