【发布时间】:2014-04-29 15:17:19
【问题描述】:
我正在阅读 C 中的移位运算符。
右移 n 位除以 2 加到 n。移动有符号值可能会失败,因为对于负值,结果永远不会超过 -1:-5 >> 3 是 -1 而不是 0 像 -5/8。
我的问题是为什么转换有符号值可能会失败?
为什么-5 >> 3 的值是-1 而不是零?
请解释一下。
【问题讨论】:
-
因为右移复制了符号位。如果以负数开头,则以负数结尾(二进制中的所有1,即2的补码中的-1)。
-
@oakad 例如 -5 表示为一个字节的 1000 0101。如果我们对 ge 1111 0000 进行右移。我们如何得到 -1?
-
@venkysmarty -5 in 8 bits 是 11111011。右移 3 会得到 11111111。en.wikipedia.org/wiki/Two%27s_complement
-
一些不请自来的建议:仅在您真正关心位模式时才使用位移位。当您关心变量的值作为实际整数时,请使用算术运算。此外,当您使用位移位时,只能在无符号类型上使用。如果你位移一个负整数,它的实现取决于会发生什么。
-
@oakad:有符号量的右移行为不能保证是算术移位(移入与最高有效位相同的位)或逻辑移位(移入零);根据标准,两者都是允许的。