C++ 为什么chrono::nanoseconds的表示类型是有符号整数类型?

C++ 为什么chrono::nanoseconds的表示类型是有符号整数类型?,c++,std,chrono,C++,Std,Chrono,在gcc4.84文件/usr/include/c++/4.8中,我们有 namespace std { typedef duration<int64_t, nano> nanoseconds; 名称空间std { typedef持续时间纳秒; 为什么纳秒的表示类型是有符号的整数类型?为什么它不是无符号的?什么时候我们可以有一个带有负值的duration对象?如果两个对象a和b被定义为a-b是一个duration,那么最好是a-b=-(b-a) 要实现该反交换属性

在gcc4.84文件/usr/include/c++/4.8中,我们有

namespace std  
{
   typedef duration<int64_t, nano>     nanoseconds;
名称空间std
{
typedef持续时间纳秒;

为什么纳秒的表示类型是有符号的整数类型?为什么它不是无符号的?什么时候我们可以有一个带有负值的duration对象?

如果两个对象
a
b
被定义为
a-b
是一个duration,那么最好是
a-b=-(b-a)


要实现该反交换属性,需要对持续时间进行签名。

这不仅仅是gcc实现,它是标准([time.syn])所要求的:

typedef持续时间纳秒;
持续时间表示两个时间点A和B之间的时间差。如果A>B,则持续时间为正,否则为负,因此非常合理

什么时候可以有一个持续时间对象为负值

任何时候都可以表示负持续时间

e、 g.“提前十秒”将是
std::chrono::seconds(-10)
,如果您将其添加到某个
时间点t
中,则您将得到一个
时间点,即
t
前十秒

该标准规定,“持续时间类型测量两个时间点之间的时间(
time\u points
)它并不是说它只能测量非递减时间点之间的时间。这意味着它可以用来测量
t1
t2
之间的时间,即使
t2
。要做到这一点,你需要一个负值

如果无法对持续时间进行签名,那么为了表示表示“较早”而不是“较晚”的偏移量,您必须使用类似于
std::pair
的内容,其中
bool
表示它是正偏移量还是负偏移量,然后您必须执行以下操作:

chrono::time_point adjust(chrono::time_point t, pair<bool, duration> offset)
{
  if (offset.first)  // positive
    return t + offset.second;
  else // negative
    return t - offset.second;
}
chrono::time\u point adjust(chrono::time\u point t,对偏移)
{
if(offset.first)//正
返回t+offset.second;
否则//否定
返回t-偏移量。秒;
}

这是愚蠢的。语言和硬件已经通过使用有符号整数来支持这一点,而且效率更高。

当你从过去的某个时间点减去某个时间点时。负持续时间可能表示某个时间点之前的时间。谢谢你的回答。
chrono::time_point adjust(chrono::time_point t, pair<bool, duration> offset)
{
  if (offset.first)  // positive
    return t + offset.second;
  else // negative
    return t - offset.second;
}