我有以下代码,
if (index > ((v.size() >> 1) - 1)) { }
v.size()为0且索引为1.执行不会进入if块。但是如果我将上面的代码更改为,
int limit = (v.size() >> 1) - 1;
if (index > limit) { }
并且使用相同的v.size()和index值,执行会进入if块。
为什么会出现这种情况?感谢。
答案 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
可能会削减一些内容。