在C中将毫秒转换为秒

时间:2009-08-18 16:09:35

标签: c time

简单的C问题,我怎样才能正确并毫不含糊地将毫秒转换为秒。 有两个限制因素:

  • 我在这个微小的C编译器子集中没有浮点支持
  • 我需要将秒数四舍五入到最接近的秒数(1-499ms向下舍入,500-999ms向上舍入。不需要关心负值)

    int mseconds = 1600; // should be converted to 2 seconds
    int msec = 23487;  // should be converted to 23 seconds
    

3 个答案:

答案 0 :(得分:26)

这应该有效

int sec = ((msec + 500) / 1000);

答案 1 :(得分:5)

int seconds = msec / 1000;
if (msec % 1000 > 500)
    seconds++;

答案 2 :(得分:4)

起初我不想在x86上测试之后写这个答案,但sparc Solaris上的测试显示它与“明显的解决方案”相比有一个性能提升,所以它可能对某人有用。我是从a PDF附带的Hacker's Delight中获取的。在这里:

unsigned msec2sec(unsigned n) {
  unsigned q, r, t;
  n = n + 500;
  t = (n >> 7) + (n >> 8) + (n >> 12);
  q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14);
  q = q >> 9;
  r = n - q*1000;
  return q + ((r + 24) >> 10);
}

而不是:

unsigned msec2sec_obvious(unsigned n) {
  return (n + 500)/1000;
}

在x86上,“明显的算法”转换为添加500然后再乘以274877907,然后从edx中获取最重要的32位并将它们向右移6位 - 所以它将这个代码击败在上面(~5)次数表现差异)。

然而,在Solaris / sparc上,“明显的”被转换为对.udiv的调用 - 总而言之,在另一个方向上的性能差异为~2.5倍。