14

私はこれに少し夢中になっているように感じますが、それは私には意味がありません. 私の考えでは、呼び出しから返された任意の時点から最小時点を差し引く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;
}

これが正の整数ではなく負の整数を出力するのはなぜですか? (clang 3.3 または g++ 4.8.1)

4

3 に答える 3

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
于 2014-02-15T08:23:06.103 に答える
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)あり、これは必然的に負であると言うことです。

于 2014-02-15T08:25:46.013 に答える