添加时间戳值

时间:2017-10-11 04:39:42

标签: c++ c struct timestamp overflow

当我添加两个参数为时间戳值的结构时,我正在尝试检查溢出 溢出规则:

1.添加后,纳秒应在MAX_NS值范围内。

2.添加后,秒数应在MAX_S值范围内。

3.无需检查topseconds。(它始终在范围内)

这是我为检查溢出而编写的函数。

 #include "stdio.h"

#define MAX_NS 999999999
#define MAX_S 4294967295

typedef struct
{
 int nanoseconds;
 int seconds;
 short int topsec;
}timestamp;

timestamp timeoverflow(timestamp t1,timestamp t2)
{
 int sec1,sec2,sec3,sec4;


timestamp overflow = {0,0,0};
 if((((t1.nanoseconds) + (t2.nanoseconds % MAX_NS+1))% MAX_NS+1)>MAX_NS)
 {
    overflow.nanoseconds = (((t1.nanoseconds) + (t2.nanoseconds % MAX_NS+1))% MAX_NS+1);
    sec1 =  (((t1.nanoseconds) + (t2.nanoseconds % MAX_NS+1)) / MAX_NS+1);
 }
 else
 {
    overflow.nanoseconds = (((t1.nanoseconds) + (t2.nanoseconds % MAX_NS+1))% MAX_NS+1);
 }

 sec2  = sec1 + t2.nanoseconds/MAX_NS+1;
 if(sec2 < sec1)
 {
    overflow.topsec++;
 }

 sec3 = sec2 + t2.seconds ;
  if(sec3 < sec2)
 {
    overflow.topsec++;
 }

 sec4 = sec3 + t1.seconds;
 if(sec4 < sec3)
 {
    overflow.topsec++;
 }
 overflow.seconds = sec4;

 return (overflow);
}

 int main()
 {
    timestamp t1 = {10,4294967295,2};
    timestamp t2 = {2,10,1};
    timestamp t3 = timeoverflow(t1,t2);
    printf("%d\n",t3.nanoseconds);
    printf("%d\n",t3.seconds);
    printf("%d\n",t3.topsec);


 }

但我没有得到预期的结果。亲切的帮助。谢谢

编辑:对于给定的输入,输出应为

timestamp.nanoseconds = 12,

timestamp.seconds = 9和

timestamp.topsec = 4.

我得到的输出是: timestamp.nanoseconds = 14,

timestamp.seconds = 10

和 timestamp.topsec = 1。

1 个答案:

答案 0 :(得分:0)

可能有点晚了,但我有一些部分回复要提供给您。 您的主要问题是运算优先级(当您进行一些算术运算时,有些运算会先于其他运算完成 - 详细信息可以在operator precedence中找到。

关于您的代码的更多事实:当您像下面这样计算 overflow.nanoseconds 时:

    overflow.nanoseconds = (((t1.nanoseconds) + (t2.nanoseconds % MAX_NS+1))% MAX_NS+1);

这首先取 something% MAX_NS,然后只对结果取 +1。请记住,在 C++ 中,模运算符与乘法和除法具有相同的优先级,因此,您的加法 +1 最后完成(在上述操作中)。

要纠正这一点,在任何有 MAX_NS+1 的地方,您都应该将它们更改为 (MAX_NS+1),以便之前完成添加。或者甚至更好的是,更改声明中 MAX_NS 的值。 改写后的函数如下:

timestamp timeoverflow(timestamp t1,timestamp t2)
{
    //timestamp t1 = {10,4294967295,2};
    int sec1,sec2,sec3,sec4;


    timestamp overflow = {0,0,0};
    if((((t1.nanoseconds) + (t2.nanoseconds % (MAX_NS+1) ))% (MAX_NS+1) )>MAX_NS)
    {
        overflow.nanoseconds = ((t1.nanoseconds + t2.nanoseconds) % (MAX_NS+1)) % (MAX_NS+1);
        sec1 =  ((t1.nanoseconds) + (t2.nanoseconds % (MAX_NS+1))) / (MAX_NS+1);
    }
    else
    {
        overflow.nanoseconds = ((t1.nanoseconds +t2.nanoseconds) % (MAX_NS+1))% (MAX_NS+1);
    }
    sec2  = (sec1 + t2.nanoseconds)/(MAX_NS+1);

    if(sec2 < sec1)
    {
        overflow.topsec++;
    }

    sec3 = sec2 + t2.seconds ;
    if(sec3 < sec2)
    {
        overflow.topsec++;
    }

    sec4 = sec3 + t1.seconds;
    if (sec4 < sec3)
    {
        overflow.topsec++;
    }

    overflow.seconds = sec4;

    return (overflow);
}

这允许获取 timestamp.nanosecondstimestamp.seconds 的值,但我没有从您的代码中获得足够的信息来改进 timestamp.topsec 的计算。

这是我的输出:

nanoseconds 12
seconds 9
topsec 2