正如标题所说。
我有一条像foo | (~(-1 >> 1));
这样的行,如果它是负数则保持foo,并设置第一位以防它未设置。
(通过保持原样,我的意思是位)
但它只是没有为foo改变任何东西。
在dbeugging之后,我发现-1 >> 1
评估为-1。我很确定正确的移位确实从左侧填充了0
'但是这似乎填补了1
,而这可以解释为什么FF >> 1
会评估为FF
但这对我来说似乎是不合理的。
那么我做错了什么/我在思考这个错误的地方在哪里?
答案 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)
您的编译器使用算术右移指令,而不是标准允许的逻辑右移。要获得所需的行为,请转换为无符号类型相同的宽度,然后移动。