为什么右移有两种选择? (算术/逻辑)

时间:2013-06-07 05:29:06

标签: c bit-manipulation

为什么右移有两个选择 - 附加符号位(算术右移)或附加0(逻辑右移)以及为什么实现选择哪个?

5 个答案:

答案 0 :(得分:3)

区别在于允许处理signed(二进制补码)和无符号整数。

  • 右移有符号(二进制补码)整数时 最重要的一点是标志; 0表示正数或零,1表示 负。为了保持右移的标志,必须 复制现有的高位,或者追加符号 喜欢。

  • 右移无符号整数时,为了保留 正确的,必须在左边附加零,无论如何 现有的高阶位。

答案 1 :(得分:2)

如果你想移动符号位,我相信你正在寻找一个圆形左移操作而不是“标准左移”操作。

您可以查看以下链接中提出的问题: Circular shift in c

为了更好地理解bitwie操作,您可以查看以下维基百科页面 https://en.wikipedia.org/wiki/Bitwise_operation

答案 2 :(得分:2)

“E1的结果>> E2是E1右移E2位位置。如果E1有无符号类型 或者如果E1具有带符号类型和非负值,则结果的值为积分 部分E1 / 2 ^ E2的商。如果E1有签名类型和负值,则 结果值是实现定义的。“ - 我想你指的是这一段。

这是因为标准没有定义如何存储负数(2的补码,1的补码等) - 它是实现定义的(取决于硬件)。

对于有符号整数的左移,它“几乎”相同。

“E1< E2的结果是E1左移E2位位置;空位被填充 零。如果E1具有无符号类型,则结果的值为E1×2 ^ E2,减少模数 比结果类型中可表示的最大值多一个。如果E1有签名 类型和非负值,E1×2 ^ E2 在结果类型中可表示,那么这就是结果值;否则,行为未确定。“

答案 3 :(得分:1)

你的问题是荒谬的。在二进制补码系统中,数字的符号由其最高位确定。对于右移,您可以决定移位零(逻辑移位)或移位符号位(算术移位)。对于左移,唯一有意义的操作是移位为零。

答案 4 :(得分:0)

在二进制补码表示下,“正常”左移的行为与算术左移完全相同:左移一个负数会导致该数字加倍(只要结果不溢出)。