C ++ - 在IF内部没有正确评估右移

时间:2017-08-26 07:49:13

标签: c++

我有以下代码,

if (index > ((v.size() >> 1) - 1)) { }

v.size()为0且索引为1.执行不会进入if块。但是如果我将上面的代码更改为,

int limit = (v.size() >> 1) - 1;
if (index > limit) { }

并且使用相同的v.size()和index值,执行会进入if块。

为什么会出现这种情况?感谢。

1 个答案:

答案 0 :(得分:0)

您显然正在执行无符号比较。 v.size()的返回类型很可能是size_t,这是一个无符号整数。因此,表达式(v.size() >> 1) - 1产生最大可能的无符号整数。除非您将其转换回有符号整数类型,否则您将无法获得正比较结果。

在减法之前对ssize_t进行简单投射将解决您的问题:

if (index > (((ssize_t)v.size() >> 1) - 1)) { }

我使用了ssize_t,因为该类型保证能够保存任何size_t值,如果设置了最高有效位,则将其重新解释为负值。这不能说是int,因为在64位平台上通常只有32位。因此,正如您在第二个示例中所做的那样使用int可能会削减一些内容。