如果使用有符号整数,如何摆脱潜在的溢出检查?
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;
答案 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天。