使用签名值计算滴答时间

时间:2014-03-21 10:52:24

标签: c

如果使用有符号整数,如何摆脱潜在的溢出检查?

unsigned long ticks1 = GetTickCount();
if (SemaphoreTake(_sema, to)) // taken
{
    unsigned long ticks2 = GetTickCount();
    // take care of potential overflow
    unsigned long elapsed = ticks2 > ticks1 ? (ticks2 - ticks1) : (ticks1 - ticks2);
    // return rest time
    return elapsed < to ? to - elapsed : 0;
}
else // timed out
    return 0;

2 个答案:

答案 0 :(得分:1)

无需溢出检查。如果ticks2 < ticks1,无符号数学减法在C中定义良好,结果在数学上与elapsed = (ULONG_MAX + 1) + ticks2 - ticks1相同。当然想要ticks1 - ticks2

// unsigned long elapsed = ticks2 > ticks1 ? (ticks2 - ticks1):(ticks1 - ticks2);
unsigned long elapsed = ticks2 - ticks1;

答案 1 :(得分:0)

Microsoft: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx 表示如果您使用的时间间隔超过49.7天,则使用GetTickCount64(),或者在比较时间时检查溢出情况。所以,如果您不想进行检查,也许您只需将自己限制在49.7天。