为什么-1>> 1评估为-1?

时间:2015-09-18 08:31:27

标签: c++

正如标题所说。

我有一条像foo | (~(-1 >> 1));这样的行,如果它是负数则保持foo,并设置第一位以防它未设置。

(通过保持原样,我的意思是位)

但它只是没有为foo改变任何东西。

在dbeugging之后,我发现-1 >> 1评估为-1。我很确定正确的移位确实从左侧填充了0'但是这似乎填补了1,而这可以解释为什么FF >> 1会评估为FF但这对我来说似乎是不合理的。

那么我做错了什么/我在思考这个错误的地方在哪里?

3 个答案:

答案 0 :(得分:4)

按照标准,右移是实现定义的(5.8.3):

  

E1的值>> E2是E1右移E2位位置。 < ...>如果E1具有带符号类型和负值,则为结果值   是实现定义的。

例如,这个MSDN article提到微软的编译器

  

右移运算符导致shift-expression中的位模式为   被指定的位置数量向右移动   添加剂的表达。对于无符号数,具有的位位置   由班次操作腾空的零填充。 签名   数字,符号位用于填充空出的位位置。   换句话说,如果数字为正数,则使用0,如果数字为正数   是否定的,使用1。

似乎与您的情况相符。

答案 1 :(得分:1)

C ++标准[expr.shift](第5.8.3节)为Laravel指定:“如果E1 >> E2具有有符号类型和负值,则结果值是实现定义的。 “特别是,实现可以编译它以使用使用符号保留的移位操作。

答案 2 :(得分:1)

您的编译器使用算术右移指令,而不是标准允许的逻辑右移。要获得所需的行为,请转换为无符号类型相同的宽度,然后移动。