你如何在 timespec 结构中表达 -1 纳秒?
How do you express -1 nanosecond in a timespec structure?
timespec 结构定义为:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds [0 .. 999999999] */
};
这两个字段是带符号的数字。我可以轻松地将“现在”定义为:
timespec now{ 1'629'659'718, 564'223'121 };
我也可以定义一个null timespec
:
timespec nulltime = {};
但是从结构上看,我们似乎不能真正表达一个负数。对吗?
纳秒字段必须是 0 到 999'999'999 之间的正数(如上所示和各种手册页中提到的,如果此值超出这些范围,函数将 return EINVAL ).
所以我能想到的唯一解决办法就是在tv_sec
中使用负数。但是,在那种情况下,我看不到如何表示 -0.000000001(-1 纳秒)...因为我需要至少放置 -1 秒:
timespec minus_one_nano{ -1, 1 }; // this sounds like -1.000000001
timespec minus_one_nano{ -1, 999'999'999 }; // this is probably -1.999999999
有没有这样的东西,或者是否预期 timespec
中的所有数字都是正数?
我的{ -1, 999'999'999 }
从哪里来的?
假设我从 1.3 秒开始:
timespec a{ 1, 300'000'000 };
我想减去 1 纳秒,我这样做:
timespec b{ a.tv_sec, a.tv_sec - 1}; // b = {1, 299'999'999}
当我以 0 纳秒开始时:
timespec a{ 3, 0 }; // 3.0s
timespec b{ 2, 999'999'999 }; // a - 1ns = 2.99999999s
将相同的数学应用于 0.0s 我得到:
timespec b{ -1, 999'999'999 }; // zero - 1ns
所以数学适用于这样的负数,但要显示该数字,我必须以某种方式计算相反的数字(即执行 0 - b
然后打印“-”+正数b
)。感觉很绕。
你实际上不能在任何system/library调用中使用负时间,所以如果你只是想要一个负时间的概念(例如,你可以添加到绝对时间或间隔以获得正时间),您可以使用您喜欢的任何表示 - 仅 tv_sec 字段(可能)为负并且 tv_nsec 始终为 mod 1e9 可以。
timespec 结构定义为:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds [0 .. 999999999] */
};
这两个字段是带符号的数字。我可以轻松地将“现在”定义为:
timespec now{ 1'629'659'718, 564'223'121 };
我也可以定义一个null timespec
:
timespec nulltime = {};
但是从结构上看,我们似乎不能真正表达一个负数。对吗?
纳秒字段必须是 0 到 999'999'999 之间的正数(如上所示和各种手册页中提到的,如果此值超出这些范围,函数将 return EINVAL ).
所以我能想到的唯一解决办法就是在tv_sec
中使用负数。但是,在那种情况下,我看不到如何表示 -0.000000001(-1 纳秒)...因为我需要至少放置 -1 秒:
timespec minus_one_nano{ -1, 1 }; // this sounds like -1.000000001
timespec minus_one_nano{ -1, 999'999'999 }; // this is probably -1.999999999
有没有这样的东西,或者是否预期 timespec
中的所有数字都是正数?
我的{ -1, 999'999'999 }
从哪里来的?
假设我从 1.3 秒开始:
timespec a{ 1, 300'000'000 };
我想减去 1 纳秒,我这样做:
timespec b{ a.tv_sec, a.tv_sec - 1}; // b = {1, 299'999'999}
当我以 0 纳秒开始时:
timespec a{ 3, 0 }; // 3.0s
timespec b{ 2, 999'999'999 }; // a - 1ns = 2.99999999s
将相同的数学应用于 0.0s 我得到:
timespec b{ -1, 999'999'999 }; // zero - 1ns
所以数学适用于这样的负数,但要显示该数字,我必须以某种方式计算相反的数字(即执行 0 - b
然后打印“-”+正数b
)。感觉很绕。
你实际上不能在任何system/library调用中使用负时间,所以如果你只是想要一个负时间的概念(例如,你可以添加到绝对时间或间隔以获得正时间),您可以使用您喜欢的任何表示 - 仅 tv_sec 字段(可能)为负并且 tv_nsec 始终为 mod 1e9 可以。