C ++ unsigned long和<

时间:2014-01-08 12:53:22

标签: c++ unsigned-long-long-int

我有以下代码:

while( int()(uStartFrame - iFrameOffset) < 1)
{
    iFrameOffset--;
}

uStartFrame和iFrameOffset都是无符号长整数,因此&lt;我认为声明有点困难。 但是,我认为我使用int()修复它。 但是循环运行无限,所以我猜它不起作用。

有人可以帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

while( uStartFrame < iFrameOffset + 1)
{
    iFrameOffset--;
}

甚至更好

if(uStartFrame < iFrameOffset + 1)
    iFrameOffset = uStartFrame - 1;

最后一行还显示可能的错误。如果uStartFrame0,那么就没有unsigned long变量x可以履行uStartFrame == x + 1

答案 1 :(得分:1)

演员是错的,你应该像这样投,

(int)(uStartFrame - iFrameOffset) < 1

但是这个C风格的演员表不是真正的C ++风格,在你的情况下,static_cast更可取:

static_cast<int>(uStartFrame - iFrameOffset) < 1
static_cast<unsigned long>(uStartFrame - iFrameOffset) < 1

除此之外,当您编写int()(x)时,您定义了一个返回整数且不接受任何参数的函数,然后使用uStartFrame - iFrameOffset作为参数调用它。它甚至不应该编译,至少gcc 4.8正确地抱怨这个。

您的编译器显然会编译它,甚至可能错误地将其视为一个返回未初始化整数的函数,很可能是0,这可能解释了为什么循环永远运行。

答案 2 :(得分:0)

您将测试(uStartFrame-iFrameOffset)转换为int,而不是iFrameOffset。因此,如果iFrameOffset很大(max可能是2 ^ 64-1 - 或者更大,具体取决于系统),那么你可能需要2 ^ 64个循环才能到达终点。

这可能高达千兆秒。所以,你应该重新考虑这个循环。这不是一个好主意。