为什么对Chrono :: Nanseconds的表示类型是签名的整数类型

why is representation type for chrono::nanoseconds a signed integer type?

本文关键字:类型 整数 Nanseconds 为什么 表示 Chrono      更新时间:2023-10-16

在file/usr/include/c /4.8中的gcc 4.84中

namespace std  
{
   typedef duration<int64_t, nano>     nanoseconds;

为什么纳秒的表示类型是签名的整数类型?为什么不签名?我们什么时候可以有一个持续时间对象具有负值?

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

任何时候要表示负持续时间!

例如。"提前十秒钟"是std::chrono::seconds(-10),如果将其添加到某些time_point t中,那么您会在t之前获得十秒钟的time_point

标准显示" duration类型测量两个时间点之间的时间(time_points)。"它并不是说它只能在不淘汰时间点之间测量时间。因此,这意味着它可以用于测量t1t2之间的时间,即使t2 < t1。为此,您需要一个负值。

如果无法签署持续时间,则表示偏移表示"较早的"不是"以后",您必须使用诸如std::pair<bool, duration>之类的东西,其中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;
}

这很愚蠢。语言和硬件已经通过使用签名的整数已经更有高效地支持了这一点。

如果定义了两个对象ab,以使a - b是持续时间,那么希望拥有a - b = -(b - a)

要实施该反交通属性,需要签署持续时间。

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

typedef duration<signed integer type of at least 64 bits,        nano> nanoseconds;

持续时间代表两个时间点A和B之间的时间差。