C ++ 11 std :: chrono现在减去min

时间:2014-02-15 08:03:27

标签: c++ chrono

我觉得我对这个有点疯狂,但这对我来说没有意义。在我看来,如果我从now()调用返回的任何时间点减去最小时间点,我应该总是得到一个正的持续时间,但这不会发生。

#include <chrono>
#include <iostream>

typedef std::chrono::steady_clock myclock;

int main(int argc, char **argv) {
        myclock::time_point min = myclock::time_point::min();
        myclock::time_point now = myclock::now();
        auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(now - min).count();
        std::cout << millis << std::endl;
}

为什么打印负整数而不是正整数? (铿锵3.3或g ++ 4.8.1)

3 个答案:

答案 0 :(得分:3)

正如已经指出的那样,这是溢出的结果。请记住,有符号类型可以表示的最小值与最大值大致相同。如果now为正,那么nowmin之间的差异明显会大于min,这意味着它的大小超过类型的最大值可以代表。

如果你想保证一个正的持续时间,那么你可以使用一个稳定的时钟代替使用最小值,然后使用程序开始时间作为基数。内置时钟持续时间都是指定的,持续时间应该能够代表至少几百年的范围,所以除非你的程序运行的时间超过你的程序,否则你将获得正的持续时间。

另一个选择是选择一个已知过去时代的时钟,然后简单地说

Clock::now().time_since_epoch();

答案 1 :(得分:1)

溢出柜台,在我的机器上是signed long long

#include <chrono>
#include <iostream>
#include <limits.h>
using namespace std;

typedef std::chrono::steady_clock myclock;

int main(int argc, char **argv) {
    myclock::time_point min = myclock::time_point::min();
    long long minl = reinterpret_cast<long long&>(min);
    cout << reinterpret_cast<long long&>(min) << endl;

    auto now = myclock::now();
    long long nowl = reinterpret_cast<long long&>(now);
    cout << reinterpret_cast<long long&>(now) << endl;

    cout << (nowl-minl) << endl;

    cout << "max of signed long long:" << LLONG_MAX << endl;

    auto millis = std::chrono::duration_cast<std::chrono::seconds>(now - min).count();
    //std::cout << millis << std::endl;
}

输出:

-9223372036854775808
13924525439448122
-9209447511415327686
max of signed long long:9223372036854775807

答案 2 :(得分:1)

这就是我认为发生的事情(根据我在Apple-llvm 5.0中的调试器上观察到的内容):

myclock::time_point::min()返回最早的时间点,通常在内部用整数类型表示,比方说long long int。这种类型的最小值通常为numeric_limits<long long int>::min,即-2 ^ 63。这个值是特殊的,因为如果你否定它,你会得到相同的值,通过整数溢出(因为最大long long int是2 ^ 63 -1):

  

- ( - 2 ^ 63)== 2 ^ 63 ==(2 ^ 63 - 1)+ 1 == -2 ^ 63(溢出)

同样的逻辑适用于减法 所有这一切都说整数溢出使(now - min)实际上等同于(now + min),这必然是负面的。