当我添加两个参数为时间戳值的结构时,我正在尝试检查溢出 溢出规则:
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。
答案 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.nanoseconds
和 timestamp.seconds
的值,但我没有从您的代码中获得足够的信息来改进 timestamp.topsec
的计算。
这是我的输出:
nanoseconds 12
seconds 9
topsec 2