为什么右移有两种选择——附加符号位(算术右移)或附加 0(逻辑右移),为什么实现要选择哪个?
5 回答
不同之处在于允许处理有符号(二进制补码)和无符号整数。
当右移有符号(二进制补码)整数时,最高有效位是符号;0 表示正或零,1 表示负。为了在右移上保留符号,必须复制现有的高位,或者根据需要附加符号。
当右移一个无符号整数时,为了正确地保留大小,必须在左边附加零,而不管现有的高位如何。
如果您也想移动符号位,我相信您正在寻找循环左移操作而不是“标准左移”操作。
您可以查看以下链接上提出的问题: c 中的循环移位
为了更好地理解 bitwie 操作,您可以查看以下维基百科页面 https://en.wikipedia.org/wiki/Bitwise_operation
E1 >> E2 的结果是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有有符号类型和非负值,则结果的值是 E1 / 2 E2的商的整数部分。如果 E1 具有带符号类型和负值,则结果值是实现定义的。
我猜你指的是这一段。
这是因为该标准没有定义如何存储负数(2 的补码、1 的补码等)——它是由实现定义的(取决于硬件)。
对于有符号整数的左移“几乎”相同。
E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 × 2 E2,比结果类型中可表示的最大值多模一减少。如果 E1 具有带符号类型和非负值,并且 E1 × 2 E2 在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。
你的问题很荒谬。在二进制补码系统中,数字的符号由其最高位确定。对于右移,您可以决定移入零(逻辑移位)或符号位的副本(算术移位)。对于左移,唯一有意义的操作是移入零。
Under a twos complement representation, a "normal" left-shift acts exactly like an arithmetic left-shift: left-shifting a negative number results in that number being doubled (as long as the result does not overflow).